Home Blog Page 42

Amazon Appsync có gì hay ho?

Amazon Appsync có gì hay ho?

Trước khi bắt đầu, anh em cần hiểu AWS Appsync có sử dụng GraphQL. Nếu anh em nào chưa biết GraphQL là gì, khác biệt gì so với REST API thì anh em có thể tham khảo qua bài viết này.

Appsync

Lưu ý về mặt concept thì GraphQL khác hoàn toàn so với REST API thông thường nha anh em.

Sau khi đã nắm sơ bộ và hiểu thêm về GraphQL, anh em có thể thoải mái xúc ông AppSync này. Túm cái váy lại thì không có gì khó đâu. Nên cứ từ từ là dứt hết thôi anh em

Bắt đầu ngay thôi nào!

1. AWS Appsync là gì?

AWS Appsync sử dụng Graph Query Language như là một endpoint duy nhất thay thế cho REST API. Anh em frontend thay vì gửi request tới một số endpoint khác nhau để lấy dữ liệu, giờ đây có thể gọi tới một endpoint duy nhất.

Cần gì lấy đó, cần gì sửa đó, chính là điểm mạnh của GraphQL.

Mô hình này giảm độ phức tạp của các web application và nâng cao trải nghiệm cho enduser lúc họ truy cập trang web. Giảm thời gian tải trang web.

Appsync

AWS AppSync is a fully managed GraphQL API layer developed by Amazon Web Services. AppSync allows developers to build GraphQL APIs without much of the usual work; it handles the parsing and resolution of requests as well as connecting to other AWS services like AWS Lambda, NoSQL and SQL data stores, and HTTP APIs to gather backend data for the API. AWS AppSync là lớp quản lý GraphQL API được phát triển bởi Amazon Web Services. AppSync cho phép lập trình viên xây dựng GraphQL API mà không cần phải bỏ quá nhiều công sức, nó cũng giúp xử lý cú pháp, giải quyết các yêu cầu các AWS services như AWS Lambda, NoSQL và SQL data stores.

2. AppSync hoạt động như thế nào?

Về cơ bản AWS Appsync là một GraphQL proxy. Ở proxy này, nó nhận và xử lý tất cả GraphQL request. Proxy này sẽ xử lý tất cả các request được hỗ trợ bởi GraphQL.

Ví dụ như queries (để truy vấn dữ liệu), mutations (để thay đổi dữ liệu thông qua API) và subscriptions (dữ liệu realtime để streaming data thông qua API).

Appsync cũng cho phép developers định nghĩa và sử dụng schema của GraphQL API, thêm các function resolver cho từng request đã được định nghĩa.

Appsync

Vì nằm trong hệ sinh thái AWS nên phía sau GraphQL của Appsync có thể là:

    • Amazon DynamoDB tables
    • RDS databases
    • Amazon Elasticsearch domains
    • AWS Lambda functions

Các RDBMS này đóng vai trò như datasources, giúp GraphQL có thể trả về các truy vấn với dữ liệu chính xác.

  API là gì? Các nguyên tắc xây dựng Rest API
  Cơ bản về GraphQL trong Java

3. AppSync integrate với các AWS services khác như thế nào?

Do được phát triển bởi Amazon nên AppSync có thể dễ dàng tương tác với các services khác trong hệ sinh thái AWS. Một số ví dụ cụ thể có thể kể tới như:

    • AWS Lambda functions: GraphQL resolver có thể mapping với Lambda function.
    • DynamoDB tables: Lấy hoặc truy vẫn dữ liệu từ DynamoDB table sử dụng cho GraphQL API.
    • Amazon Elastic search domains: use an Elasticsearch domain có thể được xem như data source cho GraphQL queries.
    • AWS RDS: Kết nối tới SQL và NoSQL database instances available với RDS, và sử dụng databases and tables from that service như là data sources.

Appsync

AppSync cũng hỗ trợ một số cách để authentication:

    • AWS Cognito User Pools: dùng được authentication và authorization mechanism choGraphQL API trong AppSync.
    • AWS IAM: quản lý API access bằng cách tạo IAM users.
    • OpenID Connect: authenticate API users sử dụng OpenID identity service.

Xem thêm nhiều việc làm Java lương cao trên TopDev

4. Điểm mạnh của AppSync

Ngoài việc AppSync được hỗ trợ và phát triển với AWS, sử dụng AppSync còn có 3 ưu điểm chính sau đây. Còn có ý nào anh em cứ thoải mái bổ sung giúp nha.

Đầu tiên là kiểm soát GraphQL, với AWS tất nhiên thời gian tiết kiệm hơn nhiều

    • Fully managed GraphQL API layer: AppSync tự động tạo ra GraphQL resolver và kết nối với data source. Việc này giúp anh em tiết kiệm kha khá thời gian khi thiết lập mới API GraphQL

Appsync

Thứ hai là điểm mạnh tới từ chính GraphQL

    • Real-time subscriptions and offline functionality built in: Sử dụng AppSync cho phép sử dụng subscriptions GraphQL. Loại này thì keep connection alive, rất thích hợp cho anh em build những app sử dụng dữ liệu realtime thường xuyên. Kết hợp giữa AppSync và Amplify còn giúp anh em lưu trữ dữ liệu local, đồng bộ sau khi dữ liệu đã được chuyển lên.

Thứ ba là kết hợp với các AWS Services khác

    • Integrations with core AWS services: Do AppSync có tích hợp với AWS lambda, RDS và DynamoDB nên anh em sẽ không cần làm gì nhiều nếu muốn connect tới data source. Dành thời gian tập trung vào logic business, tránh mất thời gian vào một số thứ setup loằng ngoằng.

5. AppSync một số điểm hạn chế

Tuy tốt nhưng AppSync cũng tồn tại một số nhược điểm, theo như mặc định thì mỗi tài khoản AWS có giới hạn 25API GraphQL với App Sync. Số lượng truy vấn bị giới hạn ở mức 1000 truy vấn/s cho mỗi API.

Để tăng những con số này, anh em có thể gửi ticket yêu cầu lên AWS. Nhưng một số cái không thể tăng, anh em lưu ý check lại những điểm này xem có phù hợp với ứng dụng của mình hay không?

    • The maximum number of API keys per GraphQL API is fixed at 50. (Maximum API key cho mỗi GraphQL là 50)
    • The maximum schema document size is 1MB (maximum schema size là 1MB, nếu anh em có schema quá to nên cân nhắc)
    • The maximum GraphQL query execution timeout is 30 seconds (query thực hiện maximum là 30s, không thể config, nếu backend xử lý loằng ngoằng hơn 30s thì anh em cẩn thận chỗ này)

https://www.youtube.com/watch?v=1FGDM3MrF64

3 mục này là 3 mục hạn chế của AppSync anh em cần lưu ý, kiểm tra kĩ và check lai một lần nữa với business application mình định làm trước khi quyết định sử dụng GraphQL với AppSync

6. Ai và lúc nào nên sử dụng AppSync

Do App Sync tập trung vào sử dụng GraphQL, nên các ứng dụng trước đó đã tiếp cận hoặc sử dụng với GraphQL sẽ có khả năng tích hợp nhanh và dễ dàng hơn.

Với GraphQL thì anh em biết rồi, nếu team FE quyết định chọn, vậy công việc sẽ nhẹ gánh phần nào cho team BE. Tuy nhiên cần cân nhắc trình độ và khả năng thay đổi từ REST sang GraphQL của team.

Một yếu tố nữa cần quan tâm là mô hình business, nếu business của anh em nhỏ, cứ quẩy với REST. Nhưng nếu anh em muốn xây một application có khả năng chịu tải tốt, sử dụng dữ liệu realtime thường xuyên. Mạnh dạn quẩy xúc với GraphQL và AppSync

Ngoài ra nếu các thành phần khác như BE, Gateway, Security, Authen, Autho của anh em đã go với AWS, tất nhiên AppSync là một lựa chọn tốt. Tuy nhiên nếu datasource nằm ở Azure mà GraphQL lại AppSync thì hơi cực. Cái này anh em cũng có thể lưu tâm

7. Giá cả của AWS App Sync

Nếu anh em dùng miễn phí, AWS cho phép có 250.000 queries GraphQL hoặc mutations. Kèm theo đó là 250.000 data updates.

Về thời gian kết nối thì anh em có 600,000 phút kết nối trong 12 tháng sau khi tài khoản AWS được tạo. Ngoài bậc miễn phí thì anh em trả tiền theo bảng dưới đây.

Appsync

Yếu tốt Giá
 Queries and data modification requests  $4.00 / 1 million
 Data transfer for API responses  $0.09 / GB (decreases with higher data volume)
 Real-time updates  $2.00 / 1 million
 Connection-minutes  $0.08 / 1 million

Giá cả cũng là một yếu tố quan trọng anh em cần lưu tâm ha.

‍8. Tham khảo thêm về AppSync

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

Tác giả: Kiên Nguyễn

Bài viết liên quan

Test REST Web Service đơn giản hơn với REST Assured

Bài viết được sự cho phép của tác giả Giang Phan  Ở bài viết trước, tôi đã giới thiệu với các bạn cách test REST API trong Jersey project. Giả sử bây giờ chúng ta cần sử dụng API của bên thứ 3 (không phải source code trong jersey project của chúng ta), khi đó ta không thể sử dụng Jersey Test. Khi đó, chúng ta cần một thư viện khác có thể giúp chúng ta gửi một request thật để verfiy kết quả trả về. Trong bài này tôi sẽ giới thiệu với các bạn một thư viện rất mạnh mẽ để test web service, đó chính là REST Assured. Nó cho phép chúng ta gửi một HTTP request thật và verify trên kết quả trả về một cách dễ dàng. Chẳng hạn chúng ta có một request http://localhost:8080/lotto/{id} và server trả về response JSON như sau: [caption id="attachment_52759" align="aligncenter" width="335"] Test REST Web Service[/caption] Khi đó chúng ta dễ dàng sử dụng REST Assured để verify mọi thứ từ response trên như sau: [caption id="attachment_52758" align="aligncenter" width="560"] Test REST Web [...]

Type Query trong GraphQL với Spring Boot

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh Trong bài viết trước, mình đã giới thiệu với các bạn về GraphQL, những vấn đề mà GraphQL đã giải quyết được cho những hạn chế của RESTful Web Service. Mình cũng đã hướng dẫn  sơ qua cho các bạn về cách hiện thực type Query của GraphQL với Spring Boot. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết hơn về cách hiện thực type Query này sử dụng Spring Boot các bạn nhé! Đầu tiên, mình sẽ tạo một Spring Boot project với Web và GraphQL Starter để làm ví dụ: Kết quả: Như mình đã nói trong bài viết trước, để làm việc với GraphQL, chúng ta cần định nghĩa các tập tin schema .graphqls. Mặc định thì Spring Boot sẽ scan tất cả các thư mục trong classpath src/main/resources của project để đọc các tập tin schema này. Mình sẽ tạo một thư mục tên là graphql trong thư mục src/main/resources và để cá [...]

REST Web service: Tạo ứng dụng Java RESTful Client với Jersey Client 2.x

Bài viết được sự cho phép của tác giả Giang Phan Trong bài trước chúng ta đã cùng tìm hiểu cách xây dựng ứng dụng Java Restful web service với Jersey 1.x. Trong bài này, chúng ta sẽ cùng tìm hiểu cách tạo ra ứng dụng Java Restful web service với Jersey 2.x và ứng dụng Java RESTful Client sử dụng Jersey Client API để gọi tới RESTful web service. [irp posts="32819" name="4 tips học Java cơ bản nhanh nhất dành cho Beginner Developer"] [irp posts="4178" name="5 cách chia một mảng lớn thành nhiều mảng nhỏ trong Javascript"] Xem thêm tuyển dụng Java hấp dẫn trên TopDev 1. Tạo Jersey project Trong bài trước chúng ta đã tạo Restful web service sử dụng Jersey version 1.x. Trong bài này, chúng ta sẽ tạo Jersey project với version 2.x. Jersey 1.x : các thư viện nằm trong package com.sun. Jersey 2.x : các thư viện nằm trong package org.glassfish. Vào Menu File -> New -> Dynamic Web Project -> Finish. Nhấn chuột phải lên project vừa tạo -> Configure -& [...]

Ứng tuyển ngay việc làm IT lương cao trên TopDev!

5 lỗi phổ biến thường gặp khi lập trình Android

5 lỗi phổ biến thường gặp khi lập trình Android

Bài viết được sự cho phép của tác giả Sơn Dương

Tại sao bạn nên biết những lỗi thường gặp khi lập trình android để tránh nó kịp thời? Rất nhiều chuyên gia ở các lĩnh vực khác nhau (kể cả chuyên gia phát triển Android) đều cho rằng:

Khi nỗ lực làm điều gì đó, quan trọng nhất là chúng ta phải hiểu thứ chúng ta đang làm là gì. Nhưng quan trọng không kém là việc chúng ta cần biết những điều cấm kị cần phải tránh – bằng mọi giá.

Những bài đăng của mình từ trước tới nay thường nói về cách phát triển một ứng dụng, một task vụ cụ thể nào đó trên Android.

Tuy nhiên, mình vẫn cảm thấy có gì đó thiếu sót khi không nhắc đến những sai lầm mà rất nhiều các bạn developer mắc phải.

5 lỗi thường gặp khi lập trình Android nên tráng

Bài viết này mình sẽ liệt kê 5 lỗi thường gặp nhất mà mình nghĩ các bạn Android developer nên tránh.

#1. Không sử dụng strings.xml

Điều này sẽ làm giảm trải nghiệm quốc tế hóa của ứng dụng. Vì bạn sẽ phải tự thiết kế phiên bản hiển thị chính xác của message dựa trên ngôn ngữ của người dùng.

Nếu như các String được đặt trong file strings.xml, chúng có thể dễ dàng được dịch và tích hợp vào ứng dụng.

Điều tuyệt vời là Android sẽ căn cứ vào thiết lập ngôn ngữ hệ thống để tự động chuyển sang file string.xml đúng với ngôn ngữ đó.

Những lý do biện minh cho việc bạn không dùng string-resources?

Dưới đây là một số lý do mà các bạn phát triển Android đưa ra để “viện cớ” không dùng string-resources:

Lý do 1: “Tôi chỉ dùng nó mỗi ở đây thôi”

Bây giờ thì bạn nghĩ thế, nhưng ai biết trước đươc tương lai. Sau này, bạn cần phải sử dụng lại String đó ở một nơi khác thì sao? Bạn có có chắc chắn là chỉ sử dụng ở mỗi đó thôi không?

Vì vậy, bạn nên đầu tư thêm một phút để sau này có thể dễ dàng tái sử dụng.

Lý do 2: String phức tạp và cần cập nhật liên tục

Đừng lo! Android đã hỗ trợ sẵn cho bạn có thể làm được điều đó trong String.xml file. Bạn hoàn toàn có thể cập nhật String thông qua các tham số truyền vào String. Ví dụ:

<string name="timeFormat">%1$d minutes ago</string>

Tham khảo tài liệu official của chính chủ Google tại đây.

Lý do 3: “Ứng dụng của tôi chỉ hỗ trợ một ngôn ngữ”

Thông thường, với các nhà phát triển độc lập (nhà phát triển phần mềm không phải là công ty) thường chỉ có kế hoạch cho một thị trường nào đó hoặc một ngôn ngữ nào đó, để giảm chi phí.

Nhưng hãy nghĩ lớn một chút, với thị trường rộng lớn ngoài kia. Khi ứng dụng phát triển, việc chuyển ứng dụng sang hỗ trợ thị trường mới sẽ đỡ tốn kém hơn rất nhiều nếu bạn sử dụng String.xml.

  Sử dụng Sqlite trong Android như thế nào hiệu quả nhất?

  Hướng dẫn sử dụng Content Provider trong Android

#2. Không sử dụng data-binding

Bạn có hay sử dụng hàm findViewById để tạo reference đến các View không?

Ngoài ra, trong trường hợp chúng ta cũng cần giữ view-id để đảm bảo chúng ta đang sử dụng đúng view-id nào trong findViewById.

Tất nhiên, việc này thì Android Studio có thể hỗ trợ bạn tự động, nhưng chỉ những view-id nào có sẵn trong cùng layout-tree thì mới được tìm thấy bằng findViewById. Những thứ không tồn tại sẽ trả về null (có thể gây ra một NullPointerException).

Google đã có giải pháp để tích hợp data-binding vào bất kỳ ứng dụng (mới hoặc dự án cũ) và loại bỏ tất cả view-reference mà bạn đã viết trước đó.

Một vài lợi ích của việc sử dụng data-binding :

  • Chỉ references đến những view có sẵn (điều này sẽ giúp bạn tránh được lỗi NullPointerException khi cố reference đến một view không tồn tại).
  • Có hiệu năng tốt hơn so với việc sử dụng findViewById. Bởi data-binding sẽ duyệt toàn bộ layout-tree một lần thay vì luôn duyệt layout-tree khi hàm findViewById được gọi.
  • Namespace của bạn (hay nói cách khác là các Class/Function) vẫn “clean”, và bạn không phải giữ reference đến tất cả các views.

Ngoài ra, bạn sẽ có thêm một số tính năng hay ho trong data-binding không chỉ có mỗi loại bỏ findViewById. Như ở bài viết này tác giả George Mount đã viết một Adapter cho tất cả các RecyclerView – quá kinh!

Tham khảo việc làm Android Developer Hồ Chí Minh tại TopDev

#3. Không ẩn API keys khi sử dụng Git

sai lầm trong phát triển Android

Đây là lỗi khá phổ biến và chủ yếu là do các bạn developer còn ít kinh nghiệm chưa chú ý.

Với dự án được quản lý bằng SVN hay Git, khi bạn đã từng commit một version lên server thì nó sẽ tồn tại trên đó mãi.

Người ta có thể tra lại lịch sử commit và mò ra API key đó, kể cả bạn đã xóa cái API key trong một commit sau đó.

Bạn có thể xem bài viết này để tìm hiểu cách ẩn API key khỏi repository trong khi vẫn sử dụng chúng trong quá trình build test ứng dụng mà chúng vẫn available trong source code của bạn.

#4. Không xử lý hết các trạng thái vòng đời của Activity

Tất cả các cấu hình (configuration) hay logic của Activty hiện tại sẽ bị mất khi Activity bị destroyed hay re-created.

Để đảm bảo rằng quá trình transition liền mạch, chúng ta cần lưu trữ trạng thái của ứng dụng trước khi thay đổi configuration.

Sau đó, chúng ta có thể tái tạo lại trạng thái của ứng dụng thông qua các hàm onSaveInstanceState/ onRestoreInstanceState.

Đừng để ứng dụng crash hay restart lại chỉ vì người dùng xoay ngang màn hình điện thoại nhé

#5. Không tìm hiểu các phím tắt trong Android Studio

Điều này có thể không phản ánh chất lượng đoạn mã bạn viết. Nhưng nó ảnh hưởng đến tổng quan công việc của bạn.

Android Studio được xây dựng dựa trên IntelliJ Idea (một IDE nổi tiếng về tính thân thiện với bàn phím). Điều này có nghĩa rằng, năng suất của developer có thể tăng lên bằng cách rất đơn giản. Đó là đầu tư một chút thời gian vào việc học các phím tắt.

Dưới đây là một số tài nguyên giúp bạn học/thực hành các phím tắt trên Android Studio:

  • KeyPromoter: Đây là một plugin có sẵn trong Android Studio. Nó sẽ hiển thị một hộp thoại hiển thị các lệnh phím tắt cho hành động bạn vừa thực hiện.

Hãy tin mình đi, điều này sẽ làm bạn khó chịu và bạn buộc phải học những lối tắt đó. Bạn có thể tìm và tải xuống trong Android Studio settings.

  • Cheat-sheet : Các bạn có thể download về và in ra cho dễ tra cứu. Đây là bản tổng hợp tất cả các phím tắt của Android Studio cho cả 2 nền tảng Window, MacOS.
  • Hướng dẫn chính thức từ Jetbrains – Đây là hướng dẫn chính thức được cung cấp bởi Jetbrains giúp làm chủ các phím tắt.

#Tạm kết

Đây là 5 lỗi thường gặp khi lập trình Android mà bạn nên hạn chế mắc phải. Đừng để những sai lầm làm hỏng cả dự án.

Nếu bạn có bất kỳ đề xuất hoặc bất kỳ chủ đề nào khác, hãy comment bên dưới nhé. Đừng ngại

Bài viết gốc được đăng tải tại vntalking.com

Bài viết liên quan

Debug trong Android Studio – Đây là kỹ năng cần phải giỏi

Bài viết được sự cho phép của tác giả Sơn Dương Sau khi bạn đã hoàn thành việc cài đặt máy ảo Android và biết cách kết nối điện thoại tới PC. Hãy khoan nghĩ tới việc bắt tay vào lập trình luôn. Cũng như các ngôn ngữ lập trình khác, hay bất kể ai lập trình cũng đều phải biết cách debug. Debug ứng dụng là một kỹ năng rất quan trọng cho mọi lập trình viên. Đó là lý do mình trình bày về cách debug trong android studio trước khi bắt tay vào học code ứng dụng. Nội dung bài viết gồm có: Hướng dẫn sử dụng Android Studio Debugger Tìm hiểu Breakpoit là gì và cách sử dụng nó để debug trong Android Studio Và một số thủ thuật “đắt giá” khi debug trong Android Studio Chúng ta bắt đầu nhé #1. Cách sử dụng công cụ Android Studio Debugger Công cụ Android Studio Debugger cho phép ta theo dõi ứng dụng theo thời gian thực. Ngoà [...]

Cách Thiết Lập Máy Ảo, Máy Thật & Khởi Chạy Ứng Dụng Trong Android

Bài viết được sự cho phép của tác giả Nhựt Danh Chà chà… Mình biết khi các bạn đọc đến bài học này, chắc hẳn các bạn đều rất muốn được nhìn thấy diện mạo của ứng dụng khi thực thi (khởi chạy trên thiết bị) sẽ trông như thế nào đúng không. Chưa cần biết nhiều về kiến thức Android, tại đây, khi đã đọc qua và thực hiện các thao tác cài đặt theo các bài học trước, hôm nay bạn đã có thể chạy ứng dụng được rồi, thậm chí bạn có thể mang ứng dụng này để cài đặt lên các thiết bị khác để lòe bạn bè nữa đấy. Vậy làm thế nào? Trước hết chúng ta điểm qua các cách thiết lập máy ảo và máy thật ở các bước sau. Như vậy cho dù bạn đã có hay chưa có trong tay một thiết bị Android (điện thoại hoặc máy tính bảng đều được), thì vớ [...]

Tổng Hợp Các Tip Khi Sử Dụng Android Studio

Bài viết được sự cho phép của tác giả Nhựt Danh Chắc các bạn có để ý thấy, là mỗi khi khởi chạy Android Studio lên, sẽ có một popup nhỏ với tiêu đề là Tip of the Day. Popup này xuất hiện hoài cho đến khi bạn bỏ chọn Show Tips on Startup thì thôi. Mình đồng ý với bạn là popup này cực kỳ hữu ích, nhưng không phải lúc nào chúng ta cũng đều dừng lại đọc và ghi nhớ tốt mỗi khi popup này hiện lên. Đã có lúc mình note các tip này lại ở đâu đó, nhưng rồi cũng bỏ mất. Chính vì vậy hôm nay mình quyết định một lần nữa tổng hợp tất cả chúng lại vào một bài viết, và mình cũng sẽ lọc ra các tip gần gũi và có thể được sử dụng nhiều nhất với mình và các bạn. Hi vọng bài viết hôm nay sẽ là trợ thủ đắc lực trong công việc lậ [...]

Xem thêm Việc làm IT lương cao hấp dẫn trên TopDev

Top 5 câu hỏi phỏng vấn Big Data Engineer hay gặp nhất 2024

Top 5 câu hỏi phỏng vấn Big Data Engineer hay gặp nhất

Phỏng vấn Big Data Engineer liệu có khó? Có phải Big là luôn đặt ra những câu hỏi hóc búa dành cho ứng viên phỏng vấn Big Data Engineer?

Câu trả lời là không, bất kì vị trí nào cũng có các topics cần và sẽ hỏi qua. Đơn cử như Big data engineer thì đó sẽ là các câu hỏi liên quan tới kỹ năng, khả năng xử lý dữ liệu.

Ngoài ra các công cụ thường được sử dụng cũng sẽ là câu hỏi đáng lưu tâm khi phỏng vấn vị trí này.

phỏng vấn Big Data Engineer

Chi tiết mời anh em cùng tìm hiểu qua 5 câu hỏi dưới đây. Bắt đầu ngay thôi nào!

1. Làm việc với dữ liệu, bạn xử lý duplicate data như thế nào?

Câu hỏi đầu tiên phỏng vấn Big Data Engineer đề cập tới SQL. Đã là làm việc với dữ liệu tất nhiên sẽ làm việc với dữ liệu được lưu ở các RDBMS.

Làm việc với RDBMS tất nhiên sẽ biết tới SQL, một trong những hiểu biết cơ bản để làm việc với dữ liệu. Câu hỏi này được đánh giá là câu hỏi dễ do chỉ xử lý dữ liệu trùng lặp.

phỏng vấn Big Data Engineer

Trả lời cho câu hỏi này, có nhiều cách để xử lý trùng lặp dữ liệu. Bao gồm sử dụng một số từ khoá phổ biến trong SQL. Một số keywords phổ biến bao gồm DISTINCT và UNIQUE.

Ngoài ra một số loại dữ liệu có thể sử dụng GROUP BY để loại bỏ trùng lặp.

Anh em có thể chuẩn bị thêm các câu hỏi sau:

    • Sự khác biệt giữa tuples và list là gì?
    • *args và *kwargs là gì?. Sự khác biệt?
    • Distributed file system là gì?

2. Những frameworks và ngôn ngữ nào thường được sử dụng bởi Big Data Engineer

Khởi động với câu hỏi dễ dàng đầu tiên phỏng vấn Big Data Engineer. Thông thường các kỹ sư dữ liệu lớn sẽ làm việc với một số frameworks, tools và ngôn ngữ lập trình nhất định.

Thường trong giới big data có các tools, framework của riêng mình để làm việc với dữ liệu lớn. Việc sử dụng thành thạo các công cụ cũng đồng nghĩa với việc ứng viên có khả năng có nhiều kinh nghiệm làm việc trong dự án thực tế.

phỏng vấn Big Data Engineer

Đối với câu hỏi này, anh em có thể liệt kê 3 công cụ chính thường được sử dụng bởi Big Data Engineer bao gồm:

    • Hadoop

Ngoài ra, dựa theo kinh nghiệm thực tế, anh em có thể bổ sung một số công cụ sau:

    • ElasticSearch

Ngoài ra, cần đi sâu các trường hợp cụ thể sử dụng, ví dụ Postgres, nếu thường xuyên làm việc với geospatial, anh em có thể nêu ra những cái tên cụ thể như PostGIS.

  Một số lầm tưởng về big data của software engineer
  Google Cloud hướng tới hỗ trợ tất cả dữ liệu phi cấu trúc

3. Sự khác biệt giữa dữ liệu có cấu trúc và dữ liệu không có cấu trúc

Câu hỏi phỏng vấn Big Data Engineer thứ hai liên quan tới data. Đã là kỹ sư dữ liệu tất nhiên sẽ làm việc nhiều với dữ liệu. Vậy sự khác biệt giữa dữ liệu có cấu trúc (structured data) và dữ liệu không có cấu trúc (unstructured data) là gì?

Để trả lời cho câu hỏi này, anh em có thể nêu ra một số sự khác biệt chính giữa hai loại dữ liệu này bao gồm:

    • Dữ liệu có cấu trúc (structured data) yêu cầu công cụ tích hợp ELT và được lưu trữ vào DBMS (hệ thống quản lý cơ sở dữ liệu) hoặc dữ liệu dạng bảng.
    • Dữ liệu phi cấu trúc (unstructured data) có hướng tiếp cận khác với dữ liệu, space (không gian) lưu trữ thường nhiều hơn so với dữ liệu cấu trúc
    • Ngoài ra dữ liệu phi cấu trúc (unstructured) thường khó để mở rộng, trong khi dữ liệu có cấu trúc thường dễ mở rộng hơn.

phỏng vấn Big Data Engineer

Anh em có thể chuẩn bị thêm hoặc ôn lại các câu hỏi sau:

    • Bạn định nghĩa big data như thế nào? (hoặc như thế nào là big data).
    • Data modeling là gì?
    • Những softskill nào là quan trọng đối với Big Data Engineer…

4. Bạn deploy giải pháp big data như thế nào?

Câu hỏi thứ 4 phỏng vấn Big Data Engineer đề cập tới quy trình khi đã có giải pháp xử lý dữ liệu lớn. Về cơ bản câu hỏi này đánh vào kinh nghiệm thực tế làm việc trong các dự án.

Có 3 bước cơ bản để deploy big data solutions, tuy nhiên anh em có thể thoải mái nêu thêm các bước bổ sung như kiểm tra dữ liệu, chuẩn bị dữ liệu,…

Ngoài ra ở các bước, anh em còn có thể nêu kinh nghiệm thực tế của bản thân mình, càng cụ thể thì càng tốt. Quay lại với 3 bước deploy:

    • Ingest and extract the data from each source, such as Oracle or MySQL (nhập và trích xuất dữ liệu từ các nguồn khác nhau, ví dụ như Oracle hoặc MySQL.
    • Store the data in HDFS or HBase (lưu trữ dữ liệu trong HDFS hoặc HBase)
    • Process the data by using a framework such as Hive or Spark (xử lý dữ liệu bằng các framework như Hive hoặc Spark)

Một số câu hỏi anh em có thể chuẩn bị thêm:

    • Core feature của Hadoop là gì?
    • Giải thích FSCK (file system check)?
    • Collection data types nào Hive hỗ trợ (Map, Struct, Array)

5. Những library nào thường sử dụng trong Python để xử lý dữ liệu

Câu hỏi cuối cùng phỏng vấn Big Data Engineer liên quan tới các thư viện thường được sử dụng để xử lý dữ liệu.

Cái này thì tuỳ kinh nghiệm làm việc anh em có thể nêu ra các thư viện mình thường sử dụng. Ngoài ra cũng có thể nói thêm các điểm mạnh, điểm yếu. Những bất cập có thể xảy ra trong quá trình sử dụng các library này.

phỏng vấn Big Data Engineer

Danh sách một số library anh em có thể liệt kê ra. Cũng có thể chia nhóm library theo từng mục đích sử dụng.

    • SciKit-Learn
    • NumPy
    • Pandas

Anh em cũng có thể chuẩn bị thêm các câu hỏi sau:

    • File permission trong Hadoop là gì?
    • Nếu chỉ có 1 file duy nhất, có thể tạo nhiều bảng cho 1 file dữ liệu đó không?
    • Big data trên cloud có gì đặc biệt? Điểm mạnh, điểm yếu như thế nào?

6. Tham khảo thêm phỏng vấn Big Data Engineer

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

Tác giả: Kiên Nguyễn

Bài viết liên quan

Big Data có thật sự “toàn năng” và các cơ hội nghề nghiệp trong tương lai?

Về diễn giả Anh Cảnh Trần (Calvin Canh Tran) hiện đang Senior Data Engineer tại Grab Finance Group (Singapore) Anh tốt nghiệp đại học ở Việt Nam và có khoảng thời gian 1 năm làm việc với tư cách là PHP developer. Sau đó sang Singapore để học thạc sĩ về Data Science. Sau khi tốt nghiệp thạc sĩ, anh là việc ở vị trí Data Scientist được khoảng 2.5 năm. Về sau nhận ra bản thân không hợp với công việc đó nên chuyển sang làm Data Engineer. Đến hiện tại anh đã làm việc ở vị trí Data Scientist đã được 4 năm. Sự chuyển giao giữa các vị trí công việc có gây ra khó khăn nào cho anh không? Thật sự là có khó khăn, như lúc đầu phỏng vấn làm Data Engineer mình không đạt nhiều lần. Sau khi chuyển qua lĩnh vực này mình phải học thêm rất nhiều và hầu hết là tự học vì 2 lĩnh vực này thật sự rất khác nhau, mình phải mất khá nhiều thời gian để trở [...]

Khám phá Quy trình tuyển dụng Data Engineer

Đọc bài viết dưới đây của TopDev từ kinh nghiệm của anh Calvin Cảnh Trần - Senior Data Engineer tại Grab, để hiểu rõ hơn về Quy trình và kinh nghiệm phỏng vấn Data Engineer cập nhật mới nhất trong năm 2020.  Data Engineer (Kỹ sư dữ liệu) hiện đang là ngành phát triển và nhận được sự quan tâm lớn. Nhiều cơ hội bắt đầu mở ra cho các ứng viên theo đuổi ngành nghề này. Và để có sự chuẩn bị tốt nhất, bạn cần nắm bắt rõ quy trình tuyển dụng của vị trí này. Cùng TopDev khám phá ngày những điều thú vị xoay quanh cuộc tuyển chọn cho vị trí Data Engineer nhé! Những hiểu biết cơ bản về Data Engineer Kỹ sư dữ liệu (Data Engineer) là người phát triển, xây dựng, kiểm tra và duy trì kiến trúc. Đồng thời, họ cũng là người đề xuất và đôi khi đảm nhậm việc cải thiện chất lượng dữ liệu. Để hoàn thiện và phát triển [...]

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?

Bài viết được sự cho phép của tác giả Kiên Nguyễn Chào các bạn, chúng ta đều biết rằng việc học lập trình vốn không phải là dễ dàng và không phải ai cũng có đủ kiên trì để học và học tốt được. Với các bạn sinh viên học lập trình nói riêng và những người học lập trình nói chung thì chắc hẳn đều đã nghe đến khái niệm “Cấu trúc dữ liệu và giải thuật”. Và chúng ta cũng được khuyên là nên học, nên tìm hiểu về những kiến thức này. Vậy tại sao lập trình viên lại nên học cấu trúc dữ liệu và giải thuật thì mình sẽ cùng các bạn điểm qua một vài lý do trong bài viết này. [irp posts="34918" name="Seminar môn Cấu trúc dữ liệu và giải thuật"] [irp posts="6697" name="12 Thư viện JavaScript trực quan hoá dữ liệu hot nhất năm 2019"] #1. Đó là kiế [...]

Xem thêm Top Việc làm IT trên TopDev

Worker threads là gì? Bạn đã biết khi nào thì sử dụng Worker threads trong node.js chưa?

Worker threads là gì? Sử dụng Worker threads trong node.js

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Worker threads được giới thiệu lần đầu tiên từ phiên bản node.js 10.5, tại thời điểm đó API của nó vẫn đang còn trong giai đoạn thử nghiệm trước khi chính thức nhận được bản phát hành ổn định ở phiên bản 12LTS.

Worker threads cung cấp một giải pháp giúp chạy mã Javascript trên một luồng khác song song với luồng chính. Vậy cụ thể điều này là như thế nào và nó mang lại lợi ích gì thì xin mời các bạn đọc tiếp bài viết dưới đây.

Các tác vụ đòi hỏi nhiều CPU

Có thể bạn đã biết node.js xử lý các tác vụ I/O không đồng bộ rất tốt. Nói đến I/O ở đây người ta thường liên tưởng đến những công việc liên quan đến đọc/ghi dữ liệu vào file, hay các request http…

Còn với những công việc đồng bộ chẳng hạn như những phép tính phức tạp trong một tập dữ liệu rất lớn, điều đó sẽ gây ra một cuộc tắc nghẽn nghiêm trọng ở trong luồng chính.

Tưởng tượng nếu một phép tính đồng bộ mất 10 giây để xử lý, điều đó có nghĩa là luồng chính sẽ bị chặn trong 10 giây để xử lý yêu cầu đó trước khi nó có thể xử lý những yêu cầu tiếp theo và điều đó thật là tai hại bởi vì không một ai muốn một tốc độ phản hồi của máy chủ như vậy cả.

Một ví dụ kinh điển cho những phép tính như vậy là dãy Fibonacci. Theo định nghĩa Fibonacci là một dãy vô hạn các số tự nhiên bắt đầu bằng 0 và 1, các phần tử sau đó được thiết lập theo quy tắc mỗi phần tử luôn bằng tổng hai phần tử trước nó. Một hàm Fibonacci trong Javascript có thể được viết như sau:

const fibonacci = (n) => {
  var i;
  var fib = [];

  fib[0] = 0;
  fib[1] = 1;
  for (i = 2; i <= n; i++) {
    fib[i] = fib[i - 2] + fib[i - 1];
  }
  return fib;
}

Sau đó hãy thử gọi hàm fibonacci(999999), luồng chính của bạn có thể sẽ mất hơn một giây để tính toán kết quả đó.

Woker threads là gì?

Worker threads là một module trong node.js cho phép chạy mã Javascript song song với luồng chính. Mỗi worker được chạy độc lập với nhau, tuy nhiên chúng có thể giao tiếp với nhau thông qua postMessage(). Để tìm hiểu kỹ hơn, các bạn có thể xem tài liệu đầy đủ về Worker threads ở Worker threads.

  Nguyên lý SOLID trong Node.js với TypeScript

  Shipit – Tự động deploy Javascript project

Tại sao lại cần Worker threads?

Như đã trình bày ở đầu bài viết, chúng ta có thể cần đến Worker threads để xử lý những trường hợp tính toán dữ liệu lớn hoặc phức tạp để tránh việc chặn luồng chính.

Luồng chính sẽ gửi yêu cầu đến một worker yêu cầu nó thực hiện các mã Javascript. Sau khi hoàn thành, worker sẽ thông báo đến cho luồng chính biết bằng cách gọi hàm postMessage(). Luồng chính nhận dữ liệu từ worker rồi tiếp tục xử lý yêu cầu đó.

Chúng ta có thể thấy vì mã Javascript xử lý dữ liệu phức tạp không chạy ở trong luồng chính nữa cho nên các yêu cầu tiếp theo vẫn được xử lý như bình thường mà hoàn toàn không bị chặn.

Xem thêm việc làm Node.js developer hấp dẫn nhất tại TopDev

Chi phí (cost) tạo một worker

Cho những ai chưa biết trước khi có Worker threads từ version 10.15, chúng ta đã có một số cách triển khai khác để chạy mã Javascript trên một luồng khác đó là Cluster và Child Process.

Cluster tận dụng tối đa số luồng của CPU để triển khai tối đa số luồng chính vì mặc định khi triển khai một dự án node.js nó chỉ chạy trên một luồng. Bằng cách dùng Cluster nếu máy chủ của chúng ta có 4 nhân 8 luồng thì số luồng chính tối đa được tạo ra là 8 – bằng với số luồng của CPU. Lúc này các yêu cầu đến sẽ được phân chia luân phiên nhau theo một giải thuật nào đó ví dụ như round-robin…
Nhìn chúng, Cluster là một giải pháp tận dụng số luồng của CPU để thêm một số lượng luồng chính khác.

Child Process là một giải pháp khác với Cluster. Bằng cách tạo ra một process riêng biệt với triển khai đầy đủ của một event loop + một main thread cho nên điều này gây ra một yêu cầu tài nguyên lớn cho mỗi process được tạo ra. Mặt khác, vì mỗi process là độc lập về bộ nhớ cho nên việc giao tiếp giữa các process tương đối phức tạp.

Worker threads được sinh ra để giải quyết bài toán về chi phí tài nguyên sử dụng của Child Process. Thay vì tạo một process mới, worker threads tạo ra một thread mới trong chính process của ứng dụng đang chạy. Điều này giúp giảm thiểu tài nguyên, vì tài nguyên để tạo một thread là nhỏ hơn so với process. Mặc khác các thread có tài nguyên sử dụng chung nên việc giao tiếp giữa chúng tương đối dễ dàng.

Để dễ hình dung, bạn có thể tham khảo sơ đồ so sánh về Child Process và Worker threads:

Tuy nhiên, cả hai cách triển khai Child Process và Worker threads đều tốn kém về mặt tài nguyên của hệ thống vì thế hãy cân nhắc việc tạo ra quá nhiều chúng khi sử dụng.

Sử dụng Worker threads như thế nào?

Tài liệu của node.js có đề cập đến cách triển khai đơn giản một worker, các bạn có thể xem tại Worker threads.

Trong bài viết này tôi sẽ lấy ví dụ cách triển khai đơn giản một worker thực hiện việc tính toán fibonacci trong một thread khác.

Đầu tiên hãy tạo một file main.js:

const { Worker } = require('worker_threads');

const runService = (workerData) => {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./worker.js', { workerData });

    worker.on('message', resolve);
    worker.on('error', reject);
    worker.on('exit', (code) => {
      if (code !== 0)
        reject(new Error(`stopped with  ${code} exit code`));
    });
  })
}

const run = async () => {
  const result = await runService(999999);
  console.log(result);
}

run().catch(console.log);

Tiếp theo tạo file worker.js:

const { parentPort, workerData } = require('worker_threads');

const fibonacci = (n) => {
  var i;
  var fib = [];

  fib[0] = 0;
  fib[1] = 1;
  for (i = 2; i <= n; i++) {
    fib[i] = fib[i - 2] + fib[i - 1];
  }

  parentPort.postMessage(fib);
}

fibonacci(workerData);

Sau đó hãy chạy thử main.js bạn sẽ thấy kết quả của dãy Fibonacci trong giây lát.

Để giải thích đoạn mã này, khi trong main gọi một new Worker nó sẽ tạo ra một worker là những mã có trong file worker.js. new Worker nhận vào tham số thứ hai là workerData để truyền dữ liệu từ main sang worker. Worker sau khi xử lý xong sẽ gọi một hàm postMessage để báo lại với main kết quả.

Trong triển khai Worker threads thực tế, chúng ta nên tuân thủ theo một nguyên tắc được mọi người đồng thuận để tạo sự thống nhất. Một trong số đó có thể kể đến như sử dụng những package được cộng đồng xây dựng sẵn với độ tương thích cao cùng khả năng triển khai nhanh chóng như node-worker-threads-pool npm.

Ví dụ để triển khai lại đoạn mã Fibonacci trên bằng package, tôi sẽ rút ngắn được mã đồng thời mã cũng trở nên ngắn gọn và dễ đọc hơn:

const { StaticPool } = require('node-worker-threads-pool');

const fibonacci = (n) => {
  var i;
  var fib = [];

  fib[0] = 0;
  fib[1] = 1;
  for (i = 2; i <= n; i++) {
    fib[i] = fib[i - 2] + fib[i - 1];
  }
  return fib;
}

const staticPool = new StaticPool({
  size: 4,
  task: fibonacci,
});

staticPool.exec(999999).then(console.log);

Tổng kết

Worker threads là một module trong node.js cho phép chạy mã Javascript song song với luồng chính. Sử dụng worker threads khi chúng ta có những đoạn mã đồng bộ chiếm một thời gian xử lý lớn. Bằng cách đó sẽ giảm tải được cho luồng chính tiếp tục xử lý những yêu cầu tiếp theo mà không bị chặn trong một khoảng thời gian.

Chi phí tài nguyên để tạo ra một worker là ít hơn so với Child Process, tuy nhiên cả hai vốn đều “đắt giá” nên cần thận trọng khi tạo ra quá nhiều.

Bài viết gốc được đăng tải tại 2coffee.dev

Bài viết liên quan

Đọc ghi file trên Node.js

Bài viết được sự cho phép của smartjob.vn Bài này mình giới thiệu về phần đọc ghi file .Trong Node js có nét mới là đọc ghi file khác so với PHP có 2 chế độ là : Đồng bộ và không đồng bộ ( hay có khái niệm mới Synchronous vs Asynchronous).Asynchronous :bất đồng bộ khi tiến trình bắt đầu chạy thì tất cả cách lệnh cùng chạy và Synchronous :đồng bộ khi tiến trình chạy thì các câu lệnh được đọc  trình tự từ trên xuống dưới. [irp posts="5311" name="10 Công ty hàng đầu thế giới sử dụng Node.js"] [irp posts="34092" name="Ghi chú file package.json của node module"] Bắt đầu ví dụ : tạo 2 file : file.js và sample.txt trong thư mục  E:\file_nodejs như sau : 1. Asynchronous đọc ghi file bất đồng bộ tiến trình bắt đầu tất cả các dòng lệnh cùng chạy  Nội dung trong file : file.js var fs = require("fs"); // Asynchronous read fs.readFile('sample.txt', function (err, data) { if (err) { return console.error(err); } console.log("cau lenh thu 1: " + data.toString()); }); console.log("cau lenh thu 2"); Nội dung trong file : example.txt chao [...]

Cách tạo một Docker đơn giản cho Node.JS

Đây là một hướng dẫn ngắn và đơn giản về docker, khá hữu ích cho các anh em Nodejs. Tại sao bạn nên sử dụng Docker? Khi công việc kinh doanh cần tới nhiều ứng dụng web khác nhau, khi mà bây giờ framework hay ngôn ngữ lập trình chỉ là công cụ. Các công ty không bị giới hạn và có thể sử dụng bất kỳ ngôn ngữ nào cần. Vì vậy chúng ta cần có một môi trường mà nhiều ứng dụng khác nhau có thể chạy cùng nhau trên đó. Virtual Machines (VM) cho phép chúng ta chạy nhiều app trên cùng 1 server. Nhưng cũng có hạn chế. Mỗi VM cần toàn bộ OS để chạy. Mỗi OS lại cần CPU, RAM,... để chạy, rồi nó cần patching và licensing, do đó làm tăng chi phí và khả năng phục hồi. Google bắt đầu sử dụng mô hình container từ lâu để giải quyết các thiếu sót của mô hình VM. Về cơ bản thì mô hình container có nghĩ [...]

Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

Bài viết được sự cho phép của tác giả Tống Xuân Hoài Đã bao giờ bạn gặp bài toán xử lý dữ liệu liên tục? Vậy thì bạn sẽ làm gì trong trường hợp Giới thiệu về composition function Composition là một cơ chế kết hợp nhiều hàm đơn giản để xây dựng một hàm phức tạp hơn. Kết quả của mỗi hàm sẽ được chuyển cho hàm tiếp theo. Nó giống như trong toán học, chúng ta có một hàm số f(g(x)), tức là kết quả của g(x) được chuyển cho hàm f. Thì composition là như vậy. Một ví dụ đơn giản: Viết hàm thực hiện phép tính 1 + 2 * 3. Đối với phép tính này chúng ta phải thực hiện phép nhân trước sau đó đến phép cộng. Đoạn mã khi được triển khai bằng các hàm trong Javascript sẽ trông như thế này: const add = (a, b) => a + b; const mult = (a, b) => a * b; add(1, mult(2, 3)); Oh! hàm chạy rất tố [...]

Đừng bỏ lỡ hàng loạt IT job hot tại TopDev

Bộ câu hỏi phỏng vấn IT Manager và cách trả lời hay nhất

Bộ câu hỏi phỏng vấn IT Manager và cách trả lời hay nhất

Trong một công ty, tổ chức thì IT Manager là người chịu trách nhiệm quản lý hệ thống công nghệ và toàn bộ thông tin liên quan giúp duy trì sự ổn định và bảo mật của các hoạt động. Với vai trò quan trọng đó thì vị trí IT Manager luôn có nhu cầu tuyển dụng cao với mức đãi ngộ tốt, được nhiều công ty chú trọng. Bài viết hôm nay chúng ta cùng nhau tìm hiểu danh sách những câu hỏi tuyển dụng vị trí IT Manager để có thể chuẩn bị tốt nhất cho buổi phỏng vấn sắp tới nhé.

IT Manager là gì? Công việc của một IT Manager

IT Manager là gì?

IT Manager là những chuyên gia công nghệ thông tin, công việc hàng ngày là lên kế hoạch, chỉ đạo và giám sát các hoạt động liên quan đến máy tính và hệ thống thông tin của công ty. IT Manager cũng là người quản lý bộ phận IT của phòng ban và là người chỉ đạo thực hiện các dự án công nghệ. Công việc của một IT Manager chia làm 2 nhiệm vụ chính:

  • Đảm bảo các hoạt động và dự án công nghệ của doanh nghiệp phát triển tốt:
    • Đánh giá nhu cầu, xem xét nguồn lực từ đó lên kế hoạch cải tiến hệ thống của công ty nhằm nâng cao hiệu suất
    • Đề xuất phương án cải tiến và nâng cấp
    • Phát triển và giám sát chính sách công nghệ thông tin
    • Giám sát các dự án công nghệ liên quan đến hệ thống của công ty
  • Quản lý nhân sự, nguồn lực IT của doanh nghiệp:
    • Phân bổ nguồn lực nhân sự cho các dự án
    • Đảm bảo nhân viên làm việc hiệu quả và hoàn thành công việc

  Program Manager là gì? Học gì để trở thành Program Manager

Kể tên một số mô hình mạng dùng trong doanh nghiệp phổ biến

Mô hình mạng là hệ thống kết hợp nhiều yếu tố để kết nối các máy tính, thực hiện nhiệm vụ thu thập, xử lý phân phối và lưu trữ dữ liệu. Đối với doanh nghiệp có một số mô hình mạng phổ biến sử dụng như sau:

  • Mạng 3 tầng (3-layer network): hệ thống mạng được chia thành 3 tầng gồm Access, Distribution và Core.
  • Multi-chassis LAG: cải tiến trên mô hình mạng 3 tầng với việc gom các kết nối thành nhóm (Link Aggregation Group).
  • CLOS Network: hệ thống chuyển mạch kênh – một giải pháp tối ưu kiến trúc mạng doanh nghiệp gồm 3 chặng từ khi dữ liệu đi vào cho tới khi đi ra gồm: Ingress, Middle và Egress.
  • IP Fabric, VXLAN: VXLAN được thiết kế với mô hình Leaf-Spine cung cấp các dịch vụ kết nối Layer2 và Layer3 thông qua mạng IP. Đây được xem như mô hình hiện đại thay thế khắc phục mô hình 3 lớp cũ trước đây.

Data Center là gì? Các tiêu chí xây dựng một Data Center cho doanh nghiệp

Data Center là gì?

Data Center (DC) hay trung tâm dữ liệu là nơi tập trung các thiết bị, tài nguyên công nghệ thông tin với mật độ cao, cung cấp các chức năng xử lý, lưu trữ thông tin một cách ổn định, nhanh chóng. Để xây dựng một Data Center “chuẩn” cho doanh nghiệp, có một số tiêu chí sau cần được đảm bảo:

  • Hệ thống nguồn điện ổn định, đảm bảo có hệ thống dự phòng cung cấp điện liên tục
  • Hệ thống an ninh, bảo mật tốt, camera giám sát liên tục
  • Hệ thống chống sét, hỏa hoạn; hệ thống làm mát chuẩn đảm bảo máy chủ luôn hoạt động tốt
  • Đáp ứng đánh giá dựa trên 4 cấp độ của thang đo ANSI/TIA-942 hoặc Uptime Tier

Tham khảo việc làm Project Manager hấp dẫn trên TopDev

Phân biệt các phần mềm tích hợp SCM, ERP và CRM sử dụng trong doanh nghiệp

SCM, ERP và CRM

SCM, ERP và CRM là 3 hệ thống phần mềm tích hợp phổ biến được áp dụng trong các hoạt động kinh doanh, vận hành của doanh nghiệp. 3 phần mềm này có mối quan hệ chặt chẽ, hỗ trợ và trao đổi các quy trình cùng dữ liệu cho nhau. Cụ thể:

  • SCM: Supply Chain Management hay hệ thống quản lý chuỗi cung ứng là phần mềm tập trung vào các tiến trình hậu cần, mua sắm với nhà cung cấp nhằm mục đích tối ưu hóa việc lập kế hoạch mua sắm các yếu tố đầu vào phục vụ cho sản xuất. Ứng dụng SCM giúp theo dõi việc lưu hành của sản phẩm và dịch vụ từ nhà cung cấp tới khách hàng, đồng thời quản lý nhà kho, lưu vận, vận hành và các yêu cầu liên quan khác.
  • CRM: Customer Relationship Management hay hệ thống quản lý quan hệ khách hàng là hệ thống tích hợp liên tổ chức đặt trọng tâm vào khả năng giao tiếp với bên ngoài gồm khách hàng và nhà cung cấp. Mục đích sử dụng CRM là giúp doanh nghiệp có thể tìm được những khách hàng mới, duy trì mối quan hệ với các khách hàng cũ cũng như việc tối ưu hóa chi phí hoạt động và phục vụ khách hàng.
  • ERP: Enterprise Resource Planning hay hệ thống hoạch định tài nguyên doanh nghiệp là phần mềm tích hợp và phối hợp nhiều lĩnh vực hoạt động, phòng ban trong doanh nghiệp như tài chính kế toán, kinh doanh sản xuất, quản trị nhân lực, bán hàng, marketing, … Có thể xem ERP như một phần mềm tổng quan cho thấy được tất cả các hoạt động diễn ra trong doanh nghiệp, nó cũng kết nối với 2 hệ thống SCM và CRM để có thể lấy được các số liệu nhằm cung cấp bức tranh chính xác về tình trạng của doanh nghiệp hiện tại.

Với tư cách là một IT Manager, việc xây dựng hay vận hành hoặc có kế hoạch triển khai 3 phần mềm tích hợp trên sẽ giúp việc quản lý của IT Manager nói riêng và việc kiểm soát hoạt động của doanh nghiệp nói chung trở nên dễ dàng và mang lại nhiều lợi ích hơn.

  Software Manager là gì? Kỹ năng cần thiết để trở thành Software Manager

Những chứng chỉ có giá trị dành cho vị trí IT Manager

Chứng chỉ IT Manager có giá trị giúp bạn chứng minh được năng lực trong lĩnh vực quản lý của mình. Một số chứng chỉ phổ biến có giá trị cao như sau:

  • CGEIT: Certified in Governance of Enterprise IT – chứng chỉ quản trị công nghệ thông tin doanh nghiệp
  • CISSP: Certified Information Systems Security Professional – chứng nhận chuyên gia bảo mật hệ thống
  • CRISC: Certified in Risk and Information Systems Control – chứng nhận kiểm soát rủi ro 
  • CITM: Certified Information Technology Manager – chứng nhận quản lý công nghệ thông tin
  • ITIL: Information Technology Infrastructure Library – thư viện cơ sở hạ tầng công nghệ thông tin
  • ITMLP: Information Technology Management and Leadership Professional – chứng nhận lãnh đạo chuyên nghiệp
  • CISM: Certified Information Security Manager – chứng chỉ quản lý bảo mật thông tin

Định hướng phát triển sự nghiệp của bạn với vai trò là IT Manager

Với câu hỏi này, bạn có thể trả lời tùy theo dự định tương lai vị trí mà bạn muốn vươn tới theo lộ trình phát triển sự nghiệp của một IT Manager. Cụ thể có một số vị trí chức vụ như sau:

  • Team Leader: vị trí đảm nhiệm vai trò quản lý team, nhóm nhỏ 3-6 người.
  • Project Manager: nếu có mong muốn làm thiên về quản lý thì PM – quản lý dự án là một vị trí bạn có thể hướng đến.
  • Manager/Director: Quản lý, giám đốc thường sẽ là vị trí cao hơn có vai trò quản lý nhiều đội nhóm cũng như nhiều dự án trong công ty.
  • CTO – Giám đốc kỹ thuật đòi hỏi kiến thức về cả chuyên môn lẫn kỹ năng quản lý, đồng thời có khả năng cập nhật kỹ thuật, xu hướng công nghệ mới.
  • CIO – Giám đốc công nghệ thông tin có vị trí điều hành hoạt động công nghệ thông tin cho doanh nghiệp, đồng thời hoạch định chiến lược đảm bảo hiệu suất làm việc cho công ty.

Kết bài

Trên đây là danh sách những câu hỏi phỏng vấn dành cho vị trí IT Manager mà các doanh nghiệp tuyển dụng sẽ có thể hỏi bạn. Hy vọng bài viết hữu ích giúp các bạn thêm tự tin để có thể ứng tuyển cho vị trí này. Cảm ơn các bạn đã đọc bài và hẹn gặp lại trong những bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm các công việc IT hấp dẫn trên TopDev

6 câu lệnh NPM hữu ích – Web dev mà bỏ qua sẽ vô cùng tiếc

6 câu lệnh NPM hữu ích – Web dev mà bỏ qua sẽ vô cùng tiếc

Bài viết được sự cho phép của tác giả Sơn Dương

Là một Javascript developer, có lẽ bạn cũng đồng ý với mình rằng NPM là một công cụ quản lý thư viện không thể thiếu.

NPM không chỉ giúp bạn cài đặt các thư viện cho dự án mà nó còn làm được nhiều hơn thế!

Cắt nghĩa thêm: Các thư viện mà npm quản lý có thể gọi là các packages hoặc dependencies. Tùy cách gọi của mọi người, nhưng bản chất chúng là một.

Từ khởi tạo dự án, cài thư viện, chạy ứng dụng tới khi build để deploy… đều đến tay NPM hết.

Qua đây, mình sẽ giới thiệu một số câu lệnh npm hữu ích giúp bạn tiết kiệm kha khá thời gian làm việc đấy.

1. Mở tài liệu hướng dẫn từ NPM

Bình thường, khi cài đặt một thư viện cho dự án, bạn cần phải tham khảo tài liệu hướng dẫn từ chính tác giả thư viện đó. Bạn sẽ làm như vào? Có phải là truy cập vào web của thư viện, tìm đến mục tài liệu không?

Quá chậm chạp và mất thời gian!

Chỉ với câu lệnh sau, bạn sẽ lao thẳng tới trang tài liệu của một thư viện:

npm home package-name

# Ví dụ:
npm home react # would take you to reactjs.org in the browser/

  Callback hell là gì? 6 cách “trị” callback hell trong javascript

  Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

2. Xem danh sách các scripts trong package

Trong package.json, bạn có thể định nghĩa các script để thực hiện một tác vụ nào đó.

Ví dụ:

Xem danh sách các scripts trong package

Như trong ví dụ trên, mình có thể chạy build dự án bằng lệnh: npm run build

Cú pháp chung là: npm run <tên script>

Trên đây chỉ là ví dụ đơn giản thôi, còn với dự án lớn thì danh sách scripts có thể rất dài, bạn sẽ vô cùng khó nhớ chúng hoặc đôi lúc lâu lâu vào lại dự án thì quên béng mất.

Bạn chỉ cần gõ lệnh sau là có thể xem được danh sách script.

npm run

Việc làm JavaScript Hồ Chí Minh dành cho bạn!

3. Bỏ qua mọi câu hỏi khi khởi tạo dự án với NPM

Bình thường, để khởi tạo dự án, có phải bạn dùng câu lệnh npm init đúng không?

Nhưng mà trình khởi tạo này nó hỏi lắm thứ quá. Nào là tên dự án, git url, tên license… Đã vội thì chứ, trong khi mình chỉ cần tạo một dự án để chạy thử một cái gì đó thôi.

Thêm thuộc tính -yes để npm điền sẵn hết thông tin mặc định, bạn khỏi cần làm gì cả.

npm init -yes

4. Cập nhật thư viện lên phiên bản mới nhất

Câu lệnh npm update mặc định của NPM CLI  sẽ chỉ cập nhật những phiên bản trong phạm vi được chỉ định trong package.json mà thôi.

Ví dụ thư viện @mdi/font như dưới đây:

Cập nhật thư viện lên phiên bản mới nhất

Nếu mình chạy lệnh npm update thì nó cũng chỉ update lên các phiên bản phụ của version 7 mà thôi, như là v7.2.0, v7.5.1… Nếu tác giả thư viện release bản v8 thì npm cũng không có update lên đâu.

Với công cụ yarn thì nó có câu lệnh: yarn upgrade-interactive –latest

Rất tiếc là npm không có câu lệnh tương tự như thế. Do đó, để làm được điều tương tự như yarn, bạn có thể sử dụng package name-check

npx npm-check --update

5. Cài đặt thư viện nhanh hơn trên CI server.

npm install sẽ tiến hành cài đặt các packages đi kèm với một số tiện ích phụ khiến nó trở lên chậm chạm vô cùng.

Tuy nhiên, những cái “phụ kiện đó” lại cần trên CI server, NPM cho phép bạn bỏ qua những cái “phụ kiện” đó bằng câu lệnh:

npm ci

Ngoài ra, bạn có thể thay thế câu lệnh npm install thành npm ci trong phần cấu hình CI.

Ví dụ, Travis CI có thể cấu hình như sau:

# .travis.yml
install:
- npm ci
# keep the npm cache around to speed up installs
cache:
 directories:
 - "$HOME/.npm"

6. Mở trang báo bugs của thư viện

Khi sử dụng thư viện, đôi khi bạn gặp một lỗi nào đó mà chưa biết cách giải quyết. Bạn có thể tham khảo các bugs tương tự mà người khác đã gặp hoặc báo trực tiếp tới tác giả thông qua trang bugs.

npm bugs package-name

# Ví dụ:
npm bugs @agney/playground 

Ngoài ra, bạn có thể tự động tìm kiếm giải pháp trên stackoverflow ngay trong cửa sổ lệnh:

npx stackoverflow-cli

Mở trang báo bugs của thư viện

Cũng khá thú vị đúng không?

Trên đây là một số câu lệnh npm hữu ích mà mình tổng hợp được. Bạn còn câu lệnh nào hay ho nữa thì chia sẻ với mọi người qua mục bình luận nhé!

Bài viết gốc được đăng tải tại vntalking.com

Xem thêm:

Đừng bỏ lỡ hàng loạt IT job hot tại TopDev

Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Đã bao giờ bạn gặp bài toán xử lý dữ liệu liên tục? Vậy thì bạn sẽ làm gì trong trường hợp

Giới thiệu về composition function

Composition là một cơ chế kết hợp nhiều hàm đơn giản để xây dựng một hàm phức tạp hơn. Kết quả của mỗi hàm sẽ được chuyển cho hàm tiếp theo.

Nó giống như trong toán học, chúng ta có một hàm số f(g(x)), tức là kết quả của g(x) được chuyển cho hàm f. Thì composition là như vậy.

Một ví dụ đơn giản: Viết hàm thực hiện phép tính 1 + 2 * 3.

Đối với phép tính này chúng ta phải thực hiện phép nhân trước sau đó đến phép cộng. Đoạn mã khi được triển khai bằng các hàm trong Javascript sẽ trông như thế này:

const add = (a, b) => a + b;
const mult = (a, b) => a * b;
add(1, mult(2, 3));

Oh! hàm chạy rất tốt tuy nhiên có hơi rối một chút nhỉ. Giả sử bây giờ tôi muốn chia tất cả cho 4 thì sao? Một đoạn mã gì đó sẽ trông như thế này:

div(add(1, mult(2, 3)), 4);

Chà rối hơn rồi đấy!

Bây giờ chúng ta sẽ đi đến một ví dụ khác. Giả sử tôi có một danh sách users bao gồm tên và tuổi, hãy lấy ra tên của những người trên 18 tuổi. Đoạn mã đó sẽ giống như:

const users = [
  { name: "A", age: 14 },
  { name: "B", age: 18 }, 
  { name: "C", age: 22 },
];

const filter = (cb, arr) => arr.filter(cb);
const map = (cb, arr) => arr.map(cb);

map(u => u.name, filter(u => u.age > 18, users)); // ["C"]

Tư tưởng là tôi sẽ tạo ra 2 hàm filter & mapfilter để lọc còn map là để duyệt qua các phần tử. Đoạn mã trên hoạt động tốt tuy nhiên cũng như ví dụ đầu tiên, nó có hơn rườm rà một chút.

Vậy thì có cách nào giải quyết được ổn thoả hai vấn đề trên? Hoặc chí ít là giúp cho mã rõ ràng hơn khi điều kiện bài toán tăng thêm.

  Hướng dẫn sử dụng composer cơ bản

  Thái cực trong lập trình - Functional Programming

Triển khai

Hàm compose

Mục tiêu của tôi là sẽ tạo ra một hàm nhận vào nhiều tham số, các tham số này là những hàm nhỏ hơn để thực hiện một khối lượng công việc nhất định (Higher Order Function). Nó sẽ trông giống như là hàm compose này:

compose(function1, function2…, functionN): Function

compose nhận vào các hàm và trả ra một hàm. Tư tưởng của compose là khi nó được gọi, nó sẽ thực hiện các hàm trong tham số từ phải sang trái, kết quả của hàm trước sẽ được chuyển thành đối số của hàm sau.

Đây là một cách đơn giản để implement hàm compose bằng ES6:

const compose = (...functions) => args => functions.reduceRight((arg, fn) => fn(arg), args);

Sẽ thật là hạnh phúc với tôi nếu bạn hiểu được những gì bên trong compose thực sự làm, còn nếu không hiểu thì hãy comment ở phía dưới bài viết nhé. Tôi sẽ theo dõi comment của bạn!

Bây giờ quay trở lại với ví dụ ban đầu, ta hãy sửa lại mã một chút:

const add = a => b => a + b;
const mult = a => b => a * b;

const operator = compose(add(1), mult(2));
const result = operator(3);

// Hoặc ngắn gọn hơn chúng ta cũng có thể viết

const result = compose(add(1), mult(2))(3);

Tôi đã biến add và mult thành hàm curry, bời vì sao? Bởi vì khi chuyển nó thành curry tôi có thể dùng nó như là một tham số là hàm vào trong compose.

Được rồi bây giờ muốn tất cả chia cho 4 thì sao?

const div = a => b => b / a;
const result = compose(div(4), add(1), mult(2))(3);

Thật dễ đọc phải không. Từ trái sang phải lần lượt thực hiện nhân với 2, sau đó cộng thêm 1 và cuối cùng chia cho 4. Cứ giống như một dòng chảy vậy.

Tham khảo việc làm JavaScript hấp dẫn trên TopDev

Tương tự như vậy với ví dụ 2 hãy sửa lại mã của nó một chút:

const users = [
  { name: "A", age: 14 },
  { name: "B", age: 18 }, 
  { name: "C", age: 22 },
];

const filter = cb => arr => arr.filter(cb);
const map = cb => arr => arr.map(cb);

compose(
  map(u => u.name),
  filter(u => u.age > 18),
)(users); // ["C"]

Chúng ta có thể viết thêm một cơ số hàm nối tiếp ở trong compose mà vẫn giữ được dòng chảy dữ liệu hoạt động, và hơn hết là giữ cho đoạn mã tương đối dễ đọc.

Hàm pipe

Tương tự như composepipe cũng mang tư tưởng giống như compose chỉ duy nhất khác một điều là thứ tự thực hiện các hàm trong tham số là từ trái sang phải. Hàm pipe sẽ được implement như thế này:

const pipe = (...functions) => args => functions.reduce((arg, fn) => fn(arg), args);

Áp dụng pipe vào ví dụ 1:

const add = a => b => a + b;
const mult = a => b => a * b;

const result = pipe(mult(2), add(1))(3);

Như các bạn thấy các tham số được truyền vào ngược lại so với compose, nó sẽ thực hiện các hàm từ phải sang trái: nhân 3 với 2 rồi sau đó cộng 1.

Bạn có thể sử dụng compose và pipe tuỳ theo sở thích hoặc thói quen vì hai hàm đều mang lại kết quả tương tự nhau.

Tổng kết

Hai hàm compose và pipe tuy nhỏ nhưng nó mang lại lợi ích rất lớn trong việc áp dụng vào các bài toán xử lý dữ liệu liên tục. Nó giúp mã rõ ràng & dễ đọc hơn.

Hầu như các thư viện Javascript hỗ trợ việc xử lý dữ liệu đều có sẵn các hàm tương tự như compose hoặc pipe như _.compose_.pipe trong lodash hay composepipe trong ramdajs.

Bài viết gốc được đăng tải tại 2coffee.dev

TOP 5 ngôn ngữ lập trình khó nhất thế giới

TOP 5 ngôn ngữ lập trình khó nhất thế giới

Thế giới của ngôn ngữ lập trình vô cùng đa dạng và phong phú. Có những ngôn ngữ đơn giản và dễ tiếp cận, tuy nhiên, cũng có những ngôn ngữ lập trình kỳ quặc và khó hiểu, thách thức ngay cả những lập trình viên kỳ cựu. Trong bài viết này, chúng ta sẽ khám phá một số ngôn ngữ lập trình khó nhất thế giới. Những ngôn ngữ này không chỉ phức tạp về cú pháp, mà còn đòi hỏi lập trình viên phải có trình độ cao và sự kiên nhẫn để hiểu và làm việc với chúng.

Ngôn ngữ lập trình COW

Ngôn ngữ lập trình COW (Cowsay Oriented Language) là một ngôn ngữ lập trình độc đáo và khá kỳ quặc. Nó được lấy cảm hứng từ chương trình “cowsay” được sử dụng để in ra văn bản dưới hình dạng của một con bò. COW không phải là một ngôn ngữ lập trình chính thống, mà thay vào đó nó sử dụng các từ và cụm từ để tạo ra mã.

Ngôn ngữ lập trình COW

Trong COW, các câu lệnh được viết dưới dạng các dòng chữ tiếng Anh. Mỗi dòng chữ đại diện cho một câu lệnh cụ thể. Ngôn ngữ này được thiết kế với mục đích chính là giải trí và không được sử dụng rộng rãi cho mục đích lập trình thực tế.

Ví dụ, dưới đây là một đoạn mã COW để in ra chuỗi “Hello World!”:

MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO Moo Moo MoO MoO MoO Moo OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOoMOo MOo MOo MOo MOo Moo MOo MOo MOo MOo MOo MOo MOo MOo Moo MoO MoO MoO Moo MOo MOo MOo MOo MOo MOo Moo MOo MOo MOo MOo MOo MOo MOo MOo MooOOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo

Mặc dù COW không phải là một ngôn ngữ lập trình chính thống và không được sử dụng rộng rãi, nó mang lại sự thú vị và độc đáo trong việc tạo ra mã bằng cách sử dụng câu chuyện dễ thương với những con bò.

Ngôn ngữ lập trình Intercal

Ngôn ngữ lập trình Intercal (Short for “Compiler Language With No Pronounceable Acronym”) là một trong những ngôn ngữ lập trình khó nhất thế giới, độc đáo và không giống bất kỳ ngôn ngữ lập trình nào khác. Nó được tạo ra vào những năm 1970 với mục đích chính là trêu đùa và châm biếm các lập trình viên.

Ngôn ngữ lập trình Intercal

Intercal không được thiết kế để sử dụng trong các dự án thực tế hay môi trường phát triển chuyên nghiệp. Thay vào đó, nó mang tính chất giải trí và thách thức người lập trình với cú pháp độc đáo.

Một số đặc điểm của Intercal bao gồm:

  1. Cú pháp lạ: Intercal sử dụng cú pháp không thường xuyên và đôi khi vô lý, gồm các từ khóa như “PLEASE”, “DO”, “FORGET”, “NEXT”, “PLEASE ABSTAIN FROM ACTUALLY IMPLEMENTING”, vv. Cú pháp này làm cho việc đọc và viết mã trở nên khó hiểu và khó tiếp cận.
  2. Các câu lệnh vui nhộn: Intercal có các câu lệnh như “COME FROM”, “GO TO”, “READ OUT”, “IGNORE”, “REMIND”, tạo ra sự độc đáo và hài hước cho việc viết chương trình.
  3. Hạn chế ràng buộc: Intercal có rất ít cấu trúc điều khiển chuẩn, làm cho việc viết các cấu trúc lặp hoặc điều kiện trở nên phức tạp và khó khăn.

Ví dụ, đây là một đoạn mã Intercal đơn giản để in ra chuỗi “Hello, World!”:

DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #238
DO ,1 SUB #2 <- #108
DO ,1 SUB #3 <- #112
DO ,1 SUB #4 <- #0
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1

  Ngôn ngữ lập trình nào lương cao nhất năm 2023?

  Người mới bắt đầu nên học ngôn ngữ lập trình nào?

Ngôn ngữ lập trình Whitespace

Ngôn ngữ lập trình Whitespace được phát hành vào ngày 1 tháng 4 năm 2003 bởi tác giả Edwin Brady và Chris Morris. Tên gọi “Whitespace” (dấu cách trắng) đề cập đến việc ngôn ngữ này sử dụng chỉ khoảng trắng, tab và dòng mới để tạo thành các câu lệnh và biểu thức.

Trong Whitespace, mọi ký tự không phải dấu cách, tab hay dòng mới được coi là “không tồn tại” và bị bỏ qua. Cú pháp và cấu trúc của Whitespace chỉ dựa trên khoảng trắng và các ký tự điều khiển tương ứng. Điều này làm cho Whitespace trở thành một ngôn ngữ rất khó hiểu và khó đọc.

Ví dụ, dưới đây là một đoạn mã Whitespace để in ra chuỗi “Hello, World!”:

Ngôn ngữ lập trình Whitespace

Tổng hợp các việc làm Back-end đang tuyển trên TopDev

Ngôn ngữ lập trình Chef

Ngôn ngữ tiếp theo trong danh sách ngôn ngữ lập trình khó nhất thế giới chính là Chef. Ngôn ngữ lập trình Chef là một ngôn ngữ độc đáo và thú vị, nơi lập trình viên sử dụng cú pháp và thuật ngữ liên quan đến việc nấu ăn và nấu nướng. Ngôn ngữ này được thiết kế để tạo ra mã như một công thức nấu ăn.

Ngôn ngữ lập trình Chef

Trong Chef, các câu lệnh và biểu thức được biểu thị bằng các thành phần như một nguyên liệu (ingredient), một công cụ (utensil), một phương pháp nấu (cooking method), một bước nấu (cooking step), vv. Mỗi đoạn mã Chef thường bắt đầu bằng một danh sách nguyên liệu và kết thúc bằng một món ăn hoàn chỉnh.

Cú pháp của Chef là một sự kết hợp giữa các từ và cụm từ liên quan đến nấu ăn, như “mix”, “fold”, “stir”, “bake”, “put”, vv. Điều này tạo ra một ngôn ngữ lập trình rất độc đáo và không giống bất kỳ ngôn ngữ lập trình nào khác.

Ví dụ, dưới đây là một đoạn mã Chef để in ra chuỗi “Hello, World!”:

Hello, World!
Ingredients.
72 g flour
101 g sugar
108 g butter
108 g chocolate chips
111 g eggs
44 g vanilla extract
32 g baking powder
32 g salt

Method.
Put flour into the mixing bowl.
Put sugar into the mixing bowl.
Put butter into the mixing bowl.
Put chocolate chips into the mixing bowl.
Put eggs into the mixing bowl.
Put vanilla extract into the mixing bowl.
Put baking powder into the mixing bowl.
Put salt into the mixing bowl.
Mix the ingredients until well blended.
Fold the batter gently.
Cook the batter on the baking sheet.

Mặc dù Chef không phải là một ngôn ngữ lập trình thực tế được sử dụng trong các dự án thực tế, nó mang lại sự thú vị và sáng tạo cho những ai muốn khám phá và trải nghiệm một hình thức lập trình không truyền thống, đồng thời gợi mở về khả năng kết hợp giữa lập trình và nghệ thuật nấu ăn.

Ngôn ngữ lập trình Brainfuck

Ngôn ngữ lập trình Brainfuck được tạo ra bởi Urban Müller vào những năm 1993 như một trò đùa và thử thách cho người lập trình.

Brainfuck được thiết kế với mục đích tối giản hóa, chỉ bao gồm một tập lệnh rất nhỏ và không có cấu trúc điều khiển phức tạp. Ngôn ngữ này hoạt động trên một bộ nhớ trạng thái duy nhất, gồm một dãy các ô nhớ đơn giản và một con trỏ.

Cú pháp của Brainfuck chỉ bao gồm 8 ký tự đơn giản: +, -, >, <, [, ], ., ,. Mỗi ký tự đại diện cho một câu lệnh cụ thể trong việc thao tác với ô nhớ và di chuyển con trỏ.

Do tính đơn giản và thiếu cấu trúc của Brainfuck, việc viết chương trình trong ngôn ngữ này thường khá khó khăn và đòi hỏi sự tập trung cao. Người lập trình cần có khả năng suy nghĩ logic và tư duy trừu tượng để biểu diễn các thuật toán và tác vụ phức tạp.

Ví dụ, dưới đây là một đoạn mã Brainfuck để in ra chuỗi “Hello, World!”:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.——.——–.>+.>.

Tổng kết

Trong bài viết này chúng ta đã khám phá một số ngôn ngữ lập trình khó nhất thế giới. Từ ngôn ngữ lập trình COW, Intercal, Whitespace cho đến Chef và Brainfuck, mỗi ngôn ngữ đều mang đến một cách tiếp cận độc đáo và thách thức trong việc viết mã.

Những ngôn ngữ lập trình này thường không được sử dụng trong các dự án thực tế hoặc môi trường phát triển chuyên nghiệp. Thay vào đó, chúng mang tính chất giải trí, thách thức và thú vị cho những người muốn khám phá và đối mặt với những trở ngại đặc biệt trong việc viết mã.

Dù bạn là một lập trình viên chuyên nghiệp, người yêu công nghệ hay chỉ đơn giản là muốn khám phá và thách thức bản thân, việc tìm hiểu về những ngôn ngữ lập trình khó nhất thế giới sẽ mở ra một cánh cửa mới đầy kỳ thú trong thế giới lập trình.

Tổng hợp bởi TopDev

Xem thêm:

Tìm kiếm việc làm IT mới nhất tại TopDev!

Tận dụng ưu thế cơ sở vật chất tại Techcombank: Nền tảng Machine Learning on-premise mang lại khả năng phân tích dữ liệu mạnh mẽ

Tận dụng ưu thế cơ sở vật chất tại Techcombank: Nền tảng Machine Learning on-premise mang lại khả năng phân tích dữ liệu mạnh mẽ

Bài viết đến từ chị Nguyễn Khánh Linh – Quản lý Cao cấp Khoa học dữ liệu

Data Science team @Techcombank

Xây dựng các mô hình Học máy (Machine Learning models) để phục vụ các bài toán của doanh nghiệp hay khách hàng là một trong những công việc quan trọng của khối Dữ liệu và Phân tích (Data & Analytics Division) tại Techcombank. Mọi chuyện tưởng chừng đơn giản nếu chúng ta có ít nhu cầu hay lượng dữ liệu không cần cập nhật nhiều và thường xuyên, hoặc team quy mô nhỏ tới rất nhỏ. Tuy nhiên, khi team lớn dần và nhu cầu từ các bên ngày một nhiều, việc có một hạ tầng để phát triển những mô hình học máy này sẽ trở nên cần thiết. 

Tận dụng ưu thế cơ sở vật chất tại Techcombank: Nền tảng Machine Learning on-premise mang lại khả năng phân tích dữ liệu mạnh mẽ

Việc có một hệ thống về Machine Learning tốt sẽ giúp giải quyết các vấn đề như:

  1. Cung cấp cho nhà phân tích dữ liệu (Data analyst), nhà khoa học dữ liệu (Data scientist) và kỹ sư học máy (Machine learning engineer) một công cụ để cùng xử lý dữ liệu và phát triển thuật toán hay mô hình một cách thuận tiện, nhanh chóng.
  2. Tích hợp kèm với một kho thuộc tính (Feature/attribute store) để lưu trữ, tái sử dụng, và phát triển thêm các thuộc tính mới một cách tập trung để cải tiến mô hình.
  3. Kết nối từ đầu tới cuối (end-to-end) cho một quy trình tích hợp, phát triển cũng như triển khai liên tục (CI/CD) các mô hình học máy và code của nó, từ việc xử lý dữ liệu cho tới triển khai mô hình lên vận hành.
  4. Write Once, Run Everywhere.

Vì vậy, bài viết dưới đây sẽ giới thiệu về Machine Learning platform mà hiện tại Techcombank đang sử dụng on-premise (tại chỗ), hay còn được gọi là Research Environment (RE).

Nền tảng Machine Learning on-premise

Thiết kế tổng quan

Đầu tiên, người dùng sẽ truy cập hệ thống thông qua Web UI bằng username và password của mình. Hệ thống ML Platform này bao gồm các phần:

  1. Features Ingestion & Processing Layer: Được dựng bởi Kubernetes và đã được cài đặt Apache Spark và Airflow để giúp tạo các luồng lấy features từ các nguồn dữ liệu (vd: Datawarehouse)
  2. Offline Storage Layer: Đây là layer chứa các features sau khi được kéo về từ nguồn dữ liệu.
  3. Analyze Layer: Đây chính là component chính mà người dùng sử dụng và tương tác, đã bao gồm Jupyter Notebook, PySpark được dựng bởi Kubernetes.

Trước mắt để trả lời cho câu hỏi “vì sao dùng Kubernetes cho ML Platform”, hãy cùng tìm hiểu về Kubernetes là gì và cấu trúc của nó thế nào nhé.

Cấu trúc và mục đích sử dụng của Kubernetes (hay còn gọi là K8s)

Cấu trúc và mục đích sử dụng của Kubernetes

Kubernetes là một nền tảng mã nguồn mở, di động, có thể mở rộng để quản lý khối lượng công việc và dịch vụ được chứa trong container, hỗ trợ cả cấu hình khai báo và tự động hóa. Đây là một giải pháp tốt để đóng gói và chạy các ứng dụng của bạn với môi trường riêng biệt. Nó cung cấp cho chúng ta một framework để chạy các hệ thống phân tán một cách linh hoạt. Kubernetes có khả năng đảm nhiệm việc mở rộng quy mô và chuyển đổi dự phòng cho ứng dụng của bạn, cung cấp các mẫu deploy một các nhanh nhất.

Vì vậy, khi xem xét đến use-case của một ngân hàng như Techcombank, quy mô team Data Science có thể lớn tới hàng chục thậm chí cả trăm người thì đây là giải pháp thích hợp nhất. Mỗi một Data Scientist hay Data Analyst đều có thể tự khởi tạo một môi trường riêng của mình, chạy các ứng dụng, cài đặt thư viện hay phát triển mô hình hoặc code trên đó mà không làm ảnh hưởng đến người dùng khác. 

Features Ingestion & Processing Layer

Đây là layer phụ trách việc lấy dữ liệu ban đầu, xử lý qua các trường dữ liệu và thuộc tính một cách tự động.

Hàng tháng, hàng tuần hoặc hàng ngày, dữ liệu phải được ETL (Extract, Transform, Load) từ kho dữ liệu đến một nơi chứa, ví dụ Hadoop. Hiện tại, ML Platform đang cài đặt Airflow để giúp ETL tự động các dữ liệu này. Các bước để tự động hoá luồng ETL dữ liệu như sau:

  1. Code của bạn phải là code chạy được (executable code/program file), bao gồm input, output rõ ràng và không phải là file notebook. Bạn cần test trước trên máy cá nhân để chắc chắn rằng file code này chạy được và chạy đúng. Code mẫu cho file ETL có thể trông như sau:
config = utils.get_config_spark('etl_table',
                                local=False,
                                user='airflow',
                                driver_mem='4g',
                                driver_core='4',
                                instances='3',
                                executor_mem='4',
                                executor_core='3',
                                message=256,
                                maxResultSize='32g')

spark = utils.get_spark_session(config=config)

TIME_FORMAT = "%Y%m%d"

options = {
    "use_secret": True,
    "reader": "spark",
    "writer": "spark",
    "mode": "daily",
    'n_partition': 200,
    'output_pattern': "/path/to/output/upto_date={}",
    'query': etl_params['data_txn_query'],
    'source': 'your_data_source',
    'partition_column': etl_params['data_txn_partition_column'],
    'spark': spark,
    'spark_schema': etl_params['data_txn_schema_spark'],
    'pandas_schema': etl_params['data_txn_schema_pandas']
}

if __name__ == "__main__":
    today = (datetime.date.today() + datetime.timedelta(hours=7) - datetime.timedelta(days=2)).strftime('%Y%m%d')
    etl_table.run_ETL_raw([today], options=options)

Ta có thể có một file code khác để gộp các files nhỏ như ở trên cho các bảng khác nhau, sau đó dùng chúng để biến đổi và gộp. Ví dụ:

dag_monthly = DAG(
    dag_id="etl_monthly",
    description="etl monthly",
    schedule_interval="0 0 9 * *",
    default_args=default_args,
    catchup=False,
)

etl_src_1 = kubernetes_pod_etl(arguments=[f"path/to/etl/src1.py"],
                            task_id=" etl_src_1",
                            dag=dag_monthly)

etl_src_2 = kubernetes_pod_etl(arguments=[f"path/to/etl/src2.py"],
                            task_id=" etl_src_2",
                            dag=dag_monthly)

etl_src_3 = kubernetes_pod_etl(arguments=[f"path/to/etl/src3.py"],
                            task_id=" etl_src_3",
                            dag=dag_monthly)

etl_src_1 >> etl_src_2 >> etl_src_3 

2. Bạn cần có quyền kết nối vào các data sources cần thiết để lấy dữ liệu về. Ví dụ: 

os.environ.get('user_{your_db}')
os.environ[‘PASSWORD’]
os.environ[‘USERNAME’]

3. Viết và commit DAGs file vào Git repo, sau đó file sẽ được tự động deployed vào Airflow thông qua ArgoCD. Ví dụ như hình dưới đây.

Features Ingestion & Processing Layer

Sau đó, những file DAG sẽ được Airflow tự động chạy (execute) và tự kéo dữ liệu hay features về Offline Storage Layer. 

Offline Storage Layer

Offline Storage Layer (Tầng lưu trữ dữ liệu ngoại tuyến) là nơi lưu trữ những features sau khi đã được biến đổi logic để phù hợp với việc phân tích dữ liệu. Tầng lưu trữ dữ liệu cũng được dựng lên bởi Kubernetes, là một nơi lưu trữ centralized cho cả team Data Scientist. Features được tập trung với mục đích:

  • Thống nhất định nghĩa, logic về features giữa các team
  • Tránh việc phát triển trùng lặp features
  • Tái sử dụng những features được phát triển của team khác, tiết kiệm thời gian, tài nguyên

Để đảm bảo tính reliability và fault-tolerant cho tầng lưu trữ dữ liệu này, hệ thống Hadoop Distributed Filesystem (HDFS) được sử dụng. HDFS hỗ trợ việc replication và partition dữ liệu một cách tự động. Cụ thể hơn về HDFS, mời các bạn tham khảo tài liệu chính thức từ Apache.

Sau khi dữ liệu được lưu trữ lên HDFS, những thành viên trong team có thể truy cập để lấy và sử dụng dữ liệu một cách đơn giản thông qua câu lệnh hdfs dfs -get. HDFS được dựng trên một pod của Kubernetes và mọi người trong team Data Scientist có thể access pod và lấy dữ liệu về sử dụng cho Analyze Layer.

Offline Storage Layer

Analyze Layer

Analyze Layer (Tầng phân tích), tương tự với tầng Features Ingestion, cũng được dựng lên bởi Kubernetes. Analyze Layer là tầng cuối trong thiết kế hệ thống phân tích dữ liệu On-premises của Techcombank, nơi Data Scientist phân tích, tối đa hoá giá trị của dữ liệu mang lại cho từng bài toán cụ thể. 

Về mặt dữ liệu, như đã trình bày ở trên, sau khi dữ liệu nguồn được biến đổi thành features dễ sử dụng,  Data Scientist có thể truy cập từ một nguồn feature thống nhất của team với số lượng feature lên tới gần 1000. Data Scientist hoàn toàn có thể phát triển thêm và làm giàu cho hệ thống lưu trữ này. 

Về mặt phần cứng và sức mạnh xử lý cho từng người dùng, với sự hỗ trợ từ Kubernetes, người dùng có thể tự tạo workspace với nguyện vọng phần cứng về số nhân CPU, GPU, RAM, volume phù hợp và Kubeflow sẽ tìm cách phân bổ phần cứng phù hợp. Về mặt thư viện, để đảm bảo tính bảo mật với thư viện mã nguồn mở, những thư viện, docker image được cài lên hệ thống cần phải được kiểm duyệt trước khi sử dụng, thông qua Nexus. 

Với sự kết hợp của phần cứng, thư viện và dữ liệu, Data Scientist giờ đây đã được cung cấp một môi trường làm việc với đầy đủ công cụ để phát triển mô hình.

Monitoring

Tất nhiên, việc triển khai hệ thống On-premises sẽ gặp những sự cố không đáng có về mặt phần cứng hay sai sót trong quản lý phần mềm. Đó là lý do chúng ta cần một hệ thống giám sát thông số, performance metrics để dễ dàng trace back trong trường hợp sự cố xảy ra. Những thông số kỹ thuật này được generate thông qua Prometheus và sau đó được trực quan hoá bằng Grafana dashboard. Những câu hỏi thường gặp của Data Scientist mà Grafana có thể cung cấp câu trả lời là:

  • Tại sao code chạy mãi mà cứ quay hoài? 

=> lỗi thường gặp là do tràn RAM, check thông số về tỉ lệ giữa RAM sử dụng thực tế và RAM được cung cấp. Nếu do lỗi tràn RAM, có thể cần cung cấp thêm RAM cho người dùng, hoặc người dùng tìm cách để tối ưu hoá code của mình

– Sao không xóa được file này nhỉ?

=> lỗi thường gặp là do hết ROM và interface trên jupyter lab không xoá triệt để những dữ liệu cũ. Kiểm tra bằng việc xem thông số về bộ nhớ.


Thuộc dự án Inside GemTechnology do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!

 

Các cơ hội việc làm tại Techcombank


Bài viết liên quan

Khoa học dữ liệu - Đòn bẩy cho Ngân hàng 4.0 toàn diện

Khoa học dữ liệu là một trong những chiếc chìa khóa giúp nhiều doanh nghiệp cũng như các tổ chức tài chính lớn như ngân hàng đột phá trong kỷ nguyên 4.0. Càng ngày việc thu thập và hiểu dữ liệu dần trở thành một kim chỉ nam giúp các doanh nghiệp tạo ra tính đột phá trong tương lai.  Anh Nguyễn Hoàng Huy hiện đang là Giám đốc khoa học dữ liệu, và đã được trao bằng tiến sĩ ngành Khoa học máy tính của Đại học tổng hợp Greifswald. Năm 2012, anh được giải thưởng bài báo xuất sắc nhất của Hội khoa học dữ liệu CHLB Đức. Sau đó anh trở về Việt Nam tham gia nhiều công ty được đầu tư bài bản vào dữ liệu lớn. Ứng dụng Data Science: dữ liệu là nguồn nhiên liệu cho trí tuệ nhân tạo Theo anh, dữ liệu quan trọng như thế nào với tương lai của Digital Banking? “Thực ra dữ liệu quan trọng trong [...]

 

Kotlin là gì? Kotlin và Java khác nhau như thế nào?

Kotlin là gì? Kotlin và Java khác nhau như thế nào?

Kotlin – một cái tên đã nhanh chóng ghi dấu trong cộng đồng lập trình viên và trở thành ngôn ngữ lập trình hàng đầu cho phát triển ứng dụng di động và backend. Với sự tiến bộ và khả năng đáp ứng nhu cầu ngày càng cao của các nhà phát triển, Kotlin đã thu hút sự quan tâm từ cộng đồng lập trình toàn cầu. Vậy Kotlin là gì? Hãy cùng TopDev tìm hiểu tất tần tật những thứ liên quan đến Kotlin trong bài viết này!

Kotlin là gì? Lịch sử hình thành của Kotlin

1. Kotlin là gì?

Kotlin là một ngôn ngữ lập trình đa nền tảng (cross-platform) được phát triển bởi JetBrains, một công ty phát triển phần mềm có trụ sở tại Nga. Kotlin được thiết kế để chạy trên Java Virtual Machine (JVM) và có thể sử dụng để phát triển ứng dụng di động, web và backend.

Kotlin là gì?

Mục tiêu chính của Kotlin là cung cấp một ngôn ngữ lập trình hiện đại, có tính năng mạnh mẽ và cú pháp dễ đọc, giúp tăng cường hiệu suất và năng suất của lập trình viên. Kotlin được xây dựng với mục tiêu tương thích ngược (interoperability) với Java, điều này có nghĩa là mã nguồn Java hiện có có thể được tích hợp và sử dụng trong dự án Kotlin và ngược lại.

2. Lịch sử hình thành của Kotlin

  • Năm 2010: JetBrains bắt đầu nghiên cứu và phát triển Kotlin như một ngôn ngữ mới dựa trên JVM.
  • Tháng 7 năm 2011: Phiên bản M1 của Kotlin được giới thiệu công khai lần đầu tiên.
  • Tháng 6 năm 2013: JetBrains công bố rằng Kotlin sẽ được phát triển dưới dạng dự án mã nguồn mở.
  • Tháng 2 năm 2016: Phiên bản 1.0 của Kotlin được phát hành, đánh dấu bước ngoặt quan trọng trong lịch sử của ngôn ngữ.
  • Tháng 5 năm 2017: Google công bố hỗ trợ chính thức Kotlin trong việc phát triển ứng dụng Android.
  • Tháng 10 năm 2017: Phiên bản Kotlin 1.2 được phát hành với nhiều cải tiến như hỗ trợ cho multiplatform projects và kotlinx.coroutines.
  • Tháng 5 năm 2019: Kotlin 1.3 ra mắt với tính năng chính là Kotlin/Native, cho phép phát triển ứng dụng đa nền tảng không cần JVM.
  • Tháng 12 năm 2020: Kotlin 1.4 được phát hành với các tính năng mới như kotlinx.serialization và JVM IR compiler.
  • Tháng 8 năm 2021: Kotlin 1.5 ra mắt với nhiều cải tiến về tương thích ngược với Java và tính năng mới như sealed interfaces và implicit conversions.

  Mình đã học kotlin như thế nào?: Phần 1: từ 1 dev IOS nhảy sang dev android

Những điểm nội bật và hạn chế của Kotlin

Kotlin nhận được nhiều sự quan tâm từ các nhà lập trình với sự tăng trưởng nhanh chóng trong thời gian ngắn. Vậy ngôn ngữ lập trình này có gì đặc biệt, những ưu điểm và hạn chế của Kotlin là gì?

1. Ưu điểm

Tương thích ngược với Java: Kotlin được thiết kế để tương thích hoàn toàn với mã nguồn Java. Điều này cho phép lập trình viên dễ dàng tích hợp Kotlin vào các dự án Java hiện có và sử dụng lại mã nguồn Java đã có mà không cần phải viết lại từ đầu.

An toàn null: Kotlin có tính năng “null safety” giúp giảm thiểu lỗi NullPointerException, một lỗi phổ biến trong lập trình Java. Kotlin đưa ra cú pháp cho phép khai báo kiểu dữ liệu không thể null, giúp tránh được các lỗi liên quan đến giá trị null và tăng cường tính ổn định của ứng dụng.

Cú pháp đơn giản và dễ đọc: Kotlin có cú pháp ngắn gọn và dễ đọc, giúp lập trình viên viết mã một cách dễ dàng và nhanh chóng. Cú pháp Kotlin cũng giúp làm giảm sự lặp lại mã và tăng cường tính rõ ràng trong việc hiểu mã nguồn.

Hỗ trợ lập trình hàm: Kotlin hỗ trợ lambda expression và higher-order functions, cho phép lập trình viên sử dụng các khái niệm lập trình hàm để viết mã ngắn gọn, linh hoạt và dễ dàng đọc hiểu. Điều này giúp tăng cường tính linh hoạt và mạnh mẽ của ngôn ngữ.

Cộng đồng phát triển sáng tạo và hỗ trợ mạnh mẽ: Kotlin có một cộng đồng lập trình viên đông đảo, sáng tạo và nhiệt tình. JetBrains, công ty phát triển Kotlin, cung cấp sự hỗ trợ mạnh mẽ và liên tục cho ngôn ngữ này, và cộng đồng cũng đóng góp vào việc phát triển và cải thiện Kotlin.

Được ưu tiên hỗ trợ trong Android Studio và IDE: Việc này mang lại lợi ích cho lập trình viên bằng cách cung cấp tính năng như hoàn thành mã thông minh, phân tích mã, refactoring dễ dàng, gỡ rối hiệu quả và cập nhật liên tục.

Việc làm Mobile Developer hấp dẫn nhất trên TopDev

2. Nhược điểm

Kích thước file và tài nguyên: Kotlin có xu hướng tạo ra các file.class lớn hơn so với mã nguồn Java tương đương. Điều này có thể làm tăng kích thước ứng dụng và tiêu tốn nhiều tài nguyên hơn.

Kích thước file và tài nguyên

Tài liệu và nguồn học tập: Mặc dù Kotlin đang trở nên phổ biến, nhưng so với Java, tài liệu và nguồn học tập về Kotlin vẫn còn hạn chế. Điều này có thể làm cho việc học và nắm bắt Kotlin khó khăn hơn đối với một số lập trình viên mới.

Tốc độ biên dịch: Kotlin có thể có tốc độ biên dịch chậm hơn so với Java, đặc biệt khi xử lý các tệp mã lớn. Điều này có thể ảnh hưởng đến thời gian phát triển và kiểm thử của ứng dụng.

Thời gian khởi động ứng dụng: Ứng dụng Kotlin có thể mất thời gian khởi động lâu hơn so với ứng dụng Java tương đương. Điều này có thể gây khó khăn đối với trải nghiệm người dùng khi khởi động ứng dụng.

  Tăng tốc lập trình Android với Kotlin

Kotlin và Java khác nhau như thế nào?

Kotlin và Java khác nhau như thế nào?

Sự khác biệt giữa Java và Kotlin là gì? Dưới đây là một bảng so sánh các khía cạnh chính giữa Java và Kotlin:

Java Kotlin
Cú pháp Cú pháp dài và lặp lại Cú pháp ngắn gọn, ít lặp lại
Nullable Types Không hỗ trợ nullable types Hỗ trợ nullable types
Extension Functions Không hỗ trợ Hỗ trợ extension functions
Lambda Expressions Cú pháp dài và phức tạp Cú pháp ngắn gọn và dễ đọc
Tương thích Đầy đủ và tương thích ngược Hoàn toàn tương thích với Java
Hỗ trợ IDE IDE tốt (Eclipse, IntelliJ) IDE tốt, ưu tiên hỗ trợ trong Android Studio
Sự phát triển Đã có từ lâu và mạnh mẽ Phát triển nhanh, ngày càng phổ biến
Cộng đồng hỗ trợ Rộng lớn và phát triển Hỗ trợ cộng đồng đang tăng, nhưng còn hạn chế

Lưu ý rằng bảng so sánh này chỉ tóm tắt một số khác biệt chính giữa Java và Kotlin. Mỗi ngôn ngữ có những ưu điểm và hạn chế riêng, và lựa chọn ngôn ngữ phụ thuộc vào yêu cầu cụ thể của dự án và sở thích của lập trình viên.

Kết luận

Kotlin là một ngôn ngữ lập trình đa nền tảng mạnh mẽ và đang phát triển nhanh chóng. Với cú pháp ngắn gọn, tính năng an toàn kiểu dữ liệu, hỗ trợ tốt cho lập trình hướng đối tượng, Kotlin đã thu hút sự quan tâm của cộng đồng phát triển phần mềm. Thêm nữa, khả năng tương thích ngược với Java, sự ưu tiên hỗ trợ trong các công cụ như Android Studio và IDE, cùng với cộng đồng ngày càng phát triển, đã làm cho Kotlin trở thành một lựa chọn hấp dẫn cho việc phát triển ứng dụng đa nền tảng.

Hy vọng rằng bài viết này đã giúp bạn hiểu Kotlin là gì. Và không còn nghi ngờ gì nữa, Kotlin đã tạo ra một sự lan tỏa tích cực trong cộng đồng lập trình và đang trở thành một ngôn ngữ lập trình đầy tiềm năng cho tương lai.

TopDev tổng hợp

Có thể bạn quan tâm:

 

Xem thêm các việc làm công nghệ hấp dẫn trên TopDev

Câu hỏi phỏng vấn RPA Engineer nhất định bạn phải biết!

Câu hỏi phỏng vấn RPA Engineer nhất định bạn phải biết!

RPA là một xu hướng mới và đang hot trong giới công nghệ thời gian gần đây, được xem là một trong những giải pháp chủ chốt của Digital Business Automation triển khai cho các khách hàng doanh nghiệp. Chính vì thế mà nhu cầu tuyển dụng kỹ sư xây dựng phần mềm tự động hóa RPA Engineer hiện tại đang khá cao trên thị trường. Bài viết hôm nay chúng ta cùng nhau tìm hiểu top những câu hỏi phỏng vấn vị trí RPA Engineer thường gặp nhé.

Sự khác biệt giữa AI và RPA là gì?

Sự khác biệt giữa AI và RPA là gì?

AI (Artificial Intelligence) là công nghệ mô phỏng lại bộ não của con người về việc lấy một lượng lớn dữ liệu, tự cập nhật cho phù hợp để có thể học hỏi, tiếp thu sau đó xử lý các dữ liệu mới hay đưa ra các dự đoán và phản hồi tương ứng. 

Đối với RPA, mục đích là xử lý tốt các công việc lặp đi lặp lại dựa trên những thứ (chương trình, logic,…) được nạp vào sẵn mà không có khả năng nhận diện hay xử lý những thứ mới. Hay nói cách khác RPA không có sự thông minh của AI.

UiPath là gì?

UiPath là công cụ tự động hóa RPA phổ biến nhất hiện nay. UiPath cũng là tên của công ty chuyên sản xuất phần mềm tự động hóa quy trình bằng robot sở hữu phần mềm UiPath, giúp hỗ trợ người dùng tự động hóa quy trình bằng cách xây dựng các ứng dụng RPA trên nền tảng ngôn ngữ lập trình C#.

Các tính năng nổi bật của UiPath bao gồm:

  • Cung cấp phần mềm tự động hóa miễn phí: UiPath Community Edition
  • Hỗ trợ phát triển ứng dụng nhanh (RAD)
  • Khả năng tương thích cao: hoạt động trên máy tính để bàn (desktop), SAP, Mainframe và ứng dụng Web
  • Hỗ trợ nhiều tùy chọn lưu trữ: cloud, máy ảo và dịch vụ đầu cuối

  RPA Career Talk: Triển vọng và công việc của RPA Developer

  Trí tuệ nhân tạo (Artificial Intelligence) và cơn đau tim (Heart Attack)

Những tác vụ nào có thể sử dụng RPA để thay thế

RPA thường được sử dụng để tự động hóa các tác vụ có một hoặc nhiều đặc tính như dưới đây:

  • Tác vụ có thao tác lặp đi lặp lại theo những quy tắc nhất định
  • Tác vụ có dữ liệu được cấu trúc rõ ràng
  • Tác vụ có nghiệp vụ đã được chuẩn hóa
  • Tác vụ đòi hỏi nhiều nhân sự tham gia và dễ xảy ra lỗi do con người gây ra

Tham khảo việc làm RPA Developer hấp dẫn trên TopDev

Những ngành ứng dụng RPA phổ biến hiện nay

Những ngành ứng dụng RPA phổ biến hiện nay

RPA với ưu điểm của nó sẽ phù hợp với một số ngành nhất định, cụ thể:

  • Tài chính và ngân hàng: Các tác vụ như mở tài khoản, xác minh KYC,… với quy trình rõ ràng, làm việc với nhiều dữ liệu sẽ thích hợp để xây dựng ứng dụng RPA giúp thực hiện nhanh chóng và chính xác.
  • Lĩnh vực sản xuất/bán lẻ: Các bot phần mềm hữu ích với các tác vụ như xử lý hóa đơn, xử lý đơn hàng,… giúp giảm chi phí thuê nhân sự.
  • Lĩnh vực viễn thông: RPA giúp xử lý các tác vụ thanh toán, giải đáp thắc mắc khách hàng hay giúp việc quản lý sự cố trở nên dễ dàng hơn.
  • Lĩnh vực Logistics: Các tác vụ xử lý đơn hàng, theo dõi vận chuyển sẽ được tự động hóa nhờ các ứng dụng RPA.

Những lợi ích dành cho doanh nghiệp khi áp dụng RPA

Tùy vào ngành nghề kinh doanh của doanh nghiệp mà việc áp dụng RPA có những lợi ích khác nhau, cụ thể như sau:

  • Tiết kiệm chi phí: doanh nghiệp triển khai RPA có khả năng cắt giảm chi phí nhân sự, chi phí vận hành, chi phí xử lý lỗi phát sinh,… từ đó tối ưu được lợi nhuận.
  • Tăng năng suất: RPA cho phép tinh gọn các quy trình doanh nghiệp, giúp gia tăng năng suất xử lý công việc.
  • Nâng cao độ chính xác: Robot luôn tuân thủ quy trình với mức ổn định cao nên sẽ giảm được lỗi trong quá trình thực hiện tác vụ.
  • Hoạt động liên tục, không gián đoạn: Các bot phần mềm có khả năng hoạt động 24/7, ngoài thời gian bảo trì định kỳ thì có thể xem như hệ thống hoạt động một cách liên tục.
  • Giúp nhân viên tập trung vào công việc giá trị hơn: nhân sự sẽ có nhiều thời gian cho các tác vụ cần sự sáng tạo, cải tiến trong công việc; giảm bớt các tác vụ lặp đi lặp lại gây nhàm chán và giảm năng suất.

RPA là gì? Lập trình viên RPA làm công việc gì?

RPA – Robotic Process Automation là tâp hợp các công nghệ nhằm xây dựng các phần mềm làm thay đổi công việc của con người trên máy tính, với hiệu suất, độ chính xác cao hơn cũng như có khả năng theo dõi, đánh giá và nâng cấp được.

Hiểu một cách đơn giản hơn thì RPA cung cấp khả năng xây dựng các nhân công “Robot” làm thay việc của một nhân công “người” cho cùng một công việc; mang lại khả năng vận hành với công suất cao hơn, tốc độ, độ chính xác tốt hơn.

Lập trình viên RPA làm công việc gì?

Cách thức hoạt động của RPA là hoạt động trên tầng giao diện của trình duyệt (Web), phần mềm,… mô phỏng tương tác của con người trên giao diện đồ họa người dùng (Graphic User Interface) giữa các hệ thống khác nhau. Lập trình viên có vai trò xây dựng các quy trình cụ thể để phần mềm (Robot) mô phỏng những tương tác trên; trong trường hợp thay đổi quy trình; lập trình viên cũng là người chỉnh sửa lại “Robot” để đáp ứng, đảm bảo hoạt động vận hành.

Ngôn ngữ lập trình sử dụng trong RPA

Nền tảng RPA (RPA Platform) thường được xây dựng trên các công cụ khác nhau và tùy vào ngôn ngữ bạn có thể lựa chọn một số nền tảng như dưới đây:

  • Python: Python có rất nhiều thư viện, công cụ tích hợp và modules dành cho các tác vụ tự động hóa khác nhau. 2 thư viện phổ biến là Pandas dành cho các tác vụ sắp xếp và dọn dẹp dữ liệu; PyAutoGUI dùng để tự động hóa GUI.
  • C# .NET: bạn có thể sử dụng phần mềm UiPath hay Automation Anywhere’s – 2 trong số những công cụ xây dựng ứng dụng RPA phổ biến nhất hiện nay
  • Java: Công cụ Automation Anywhere’s cũng cho phép bạn lập trình bằng ngôn ngữ Java
  • Ngoài ra lập trình viên RPA cũng có thể lựa chọn những phần mềm, công cụ chuyên biệt phổ biến như: Blue Prism, Power Automate, Robocorp, …

Kết bài

Trên đây là danh sách những câu hỏi phỏng vấn dành cho vị trí RPA Engineer thường gặp. Hy vọng bài viết này hữu ích dành cho những bạn có dự định tìm kiếm một vị trí mới cho công việc là kỹ sư RPA. Cảm ơn các bạn đã đọc bài và hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

Xem thêm tuyển dụng IT mới nhất tại TopDev

3 cách truyền dữ liệu giữa các Components trong Vue.js

3 cách truyền dữ liệu giữa các Components trong Vue.js

Bài viết được sự cho phép bởi tác giả Sơn Dương

Dù ở bất cứ hoàn cảnh nào, việc “giao thương” qua lại là không thể tránh khỏi. Trong ứng dụng Vue.js cũng vậy. Có rất nhiều cách khác nhau để chia sẻ dữ liệu giữa các components. Tùy vào từng tình huống mà giải pháp chia sẻ dữ liệu mà bạn chọn là tốt nhất.

Chia sẻ dữ liệu giữa các components là một tính năng cốt lõi của Vue.js. Nó cho phép bạn module hóa, kiểm soát phạm vi dữ liệu và tạo một luồng trao đổi dữ liệu an toàn trong ứng dụng.

Qua bài viết này, mình sẽ chia sẻ 3 cách để truyền dữ liệu giữa các Components:

  • Sử dụng props để truyền dữ liệu từ component cha xuống component con.
  • Emitting event để chia sẻ ngược lại từ component con lên component cha.
  • Sử dụng Vuex để chia sẻ dữ liệu cho toàn ứng dụng.

Okay, bắt đầu thôi!

1. Sử dụng Props để truyền dữ liệu từ component cha xuống component con

VueJS props là cách đơn giản nhất để truyền dữ liệu giữa các Components. Hiểu đơn giản props là thuộc tính do chính chúng ta tạo ra (khác với thuộc tính do nhà phát hành vue tạo sẵn).

Sau đó, trong template, chúng ta cung cấp giá trị thông qua thuộc tính tùy chỉnh đó. Như vậy là bạn đã thực hiện chia sẻ dữ liệu giữa các component rồi đấy.

Để dễ hình dung hơn, mình sẽ lấy một ví dụ thế này: Chúng ta có một trang Profile người dùng, trong đó có thông tin về tài khoản của người đó. Với yêu cầu này, mình sẽ tạo 2 components:  AccountInfo.vue và ProfilePage.vue.

Trong AccountInfo.vue, mình sẽ khai báo props, trong đó có thuộc tính username. Kiểu như bên dưới:

//AccountInfo.vue

<template>
 <div id='account-info'>
   {{ userName }}
 </div>
</template>

<script>
export default {
 props: {
    userName: String

 }
}
</script>

Sau đó, để truyền dữ liệu từ component cha (ProfilePage.vue), chúng ta truyền dữ liệu kiểu như sau:

// ProfilePage.vue
<account-info userName='matt' />

Trong Vue.js có các VueJS directives khá hay ho. Ví dụ, bạn có thể sử dụng v:bind để truyền động giá trị cho props.

Ở trong ví dụ trên, giả sử mình muốn gán trị cho userName props thông qua một biến. Chúng ta có thể thực hiện điều này bằng cách sử dụng v:bind.

<template>
 <div>
  <account-info :username="user.username" />
 </div>
</template>

<script>
import AccountInfo from "@/components/AccountInfo.vue";

export default {
 components: {
   AccountInfo
 },
 data() {
   return {
     user: {
       username: 'matt'
     }
   }
  }
}
</script>

Nhân tiện đây, mình có một vài lưu ý về cách sử dụng Props trong Vue.js

  Sự kiện cầu nối trong giao tiếp giữa các Vue.js component

  Một vài pattern để viết component của React cần dùng chung state

#Luôn luôn verify các thuộc tính khi định nghĩa Props

Nếu bạn đang trăn trở về cách viết mã nguồn Vue sao cho sạch đẹp hơn, hãy nhớ tới một quy tắc quan trọng: luôn verify props.

Nói một cách ngắn gọn, tức là bạn luôn cần phải định nghĩa rõ ràng kiểu dữ liệu cho props. Nếu sau này khi sử dụng props đó mà bạn truyền sai kiểu dữ liệu, Vue sẽ cảnh báo.

Không nên
// Như thế này chỉ OK khi viết prototype
props: [' userName ']

Nên
props: {
  userName: String
}

Verifying props là công việc cần thiết khi xây dựng hệ thống lớn, hoặc thiết kế plugin cho ứng dụng khác. Điều này đảm bảo tất cả mọi người đều phải tuân theo quy tắc mà nhà thiết kế đã quy định.

#Đặt tên cho props theo chuẩn camelCase

Theo như hướng dẫn của chính nhà phát hành Vue, họ khuyến khích đặt tên Component, props theo chuẩn camelCase. Lý do đơn giản là trong Javascript, camelcase là quy ước đặt tên tiêu chuẩn.

// Nên
<account-info :my-username="user.username" />
props: {
   myUsername: String
}

// Không nên
<account-info :myUsername="user.username" />
props: {
   "my-username": String
}

Tham khảo việc làm React mới nhất trên TopDev

2. Emitting Events để chia sẻ ngược lại từ component con lên component cha.

Với cách sử dụng props, bạn có thể truyền dữ liệu từ cha cho con. Thế component con muốn “biếu” lại gì đó cho component cha thì sao?

Với trường hợp này, chúng ta không thể sử dụng props được. Tất nhiên là Vue có giải pháp thay thế rồi. Đó chính là sử dụng custom events và listeners.

Trong mỗi Vue instance, bạn đều có thể sử dụng hàm .$emit(eventName) để trigger một event. Và chúng ta sẽ tận dụng kỹ thuật này để truyền dữ liệu.

#Tạo một custom event

Quay lại ví dụ về trang profile trên, chúng ta cần một button để thay đổi username. Khi nhấn vào button này, chúng ta sẽ phát một event: changeUsername

<template>
 <div id='account-info'>
   <button @click='changeUsername()'>Change Username</button>
   {{username}}
 </div>
</template>

<script>
export default {
 props: {
   username: String
 },
 methods: {
   changeUsername() {
     this.$emit('changeUsername')
   }
 }
}
</script>

Bên trong component cha (ProfilePage.vue), chúng ta sẽ bắt event đó và thay đổi giá trị của biến user.username.

<template>
 <div>
   <account-info :username="user.username" @changeUsername="user.username = 'new name'"/>
 </div>
</template>

3. Sử dụng Vuex

Qua 2 giải pháp trên, chúng ta đã biết cách chia sẻ dữ liệu giữa các component “trong cùng một gia đình, giữa cha và con”… Thế còn “người ngoài” thì sao? Chúng ta có phải tạo ra một hệ thống phân cấp thật phức tạp, bao phủ toàn bộ ứng dụng để truyền dữ liệu?

Rất may không cần. Thư viện quản lý state Vuex sẽ đơn giản hóa việc truyền dữ liệu. Vuex sẽ tạo một kho lưu trữ dữ liệu mà bất kì component nào cũng có thể lấy và sử dụng được. Kho lưu trữ này được gọi là store.

Vuex là gì

Vuex là thư viện được tách ra từ Vue Core. Mục đích của thư viện Vuex là giúp quản lý state của các component trong Vue.js. Về một khía cạnh nào đó, Vuex khá tương đồng với Redux trong ReactJS. Nguyên tắc của Vuex là state chỉ có thể được thay đổi theo kiểu có thể dự đoán được.

Thư viện vuex không được tích hợp mặc định trong Vue, bạn muốn sử dụng nó thì cần phải cài đặt.

npm install vuex --save

Sau đó, trong thư mục src, bạn tạo thêm thư mục store. Tiếp tục tạo tệp index.js trong thư mục store.

// src/store/index.js

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
 state: {},
 getters: {},
 mutations: {},
 actions: {}
});

Tiếp theo, bạn cần khai báo store với Vue instance gốc.

// main.js

import store from "./store";

new Vue({
  store,
      ...

Để các bạn có thể hiểu rõ hơn về Vuex, cũng như cách sử dụng, chúng ta sẽ   cùng tìm hiểu 4 thành phần chính của Vuex store: State, Getters, Mutations, Actions.

#State

Vuex state là một object chứa dữ liệu được chia sẻ cho toàn ứng dụng. Tất cả Vue instances đều có thể truy cập được dữ liệu này.

Ví dụ:

export default new Vuex.Store({
 state: {
   user: {
     username: 'matt',
     fullName: 'Matt Maribojoc'
   }
 },
 getters: {},
 mutations: {},
 actions: {}
});

Và ở bất kỳ component nào cũng truy cập được, kiểu như thế này:

mounted () {
   console.log(this.$store.state.user.username);
},

#Getters

Chúng ta sử dụng Vuex getters để trả về dữ liệu đã được thay đổi từ giá trị khai báo trong state data. Một case sử dụng phổ biến nhất đó là coi getter như là các thuộc tính đã được tính toán theo mục đích nào đó.

Như trong ví dụ trên, mình muốn lấy first name từ full name của người dùng.

getters: {
   firstName: state => {
     return state.user.fullName.split(' ')[0]
   }
}

Sau đó thì chúng ta có thể sử dụng thuộc tính getter này như bình thường.

mounted () {
   console.log(this.$store.getters.firstName);
}

Mặc định Vuex getters chấp nhận 2 tham số:

  • state: là state object của ứng dụng.
  • getters: là store.getters object – tức là chúng ta có thể gọi getter của một store khác.

Mỗi getter mặc định sẽ có tham số đầu tiên (state). Còn tùy vào thiết kế, yêu cầu bài toán cụ thể mà bạn có thể cần tới tham số thứ 2 (getters).

Ok, lại lấy ví dụ trên, mình tạo getter lấy last name từ full name và first name.

lastName (state, getters) {
     return state.user.fullName.replace(getters.firstName, '');
}

#Mutations

Mutations là cách duy nhất để thay đổi giá trị của state object. Một chi tiết quan trọng của mutations đó là Mutations phải là synchronous.

Giống như getters, Mutations cũng chấp nhận 2 tham số:

  • State: là state object của ứng dụng.
  • Payload: là giá trị bạn muốn truyền vào cho mutations

Ví dụ:

mutations: {
   changeName (state, payload) {
     state.user.fullName = payload
   }
},

Để gọi Mutations trong component bất kỳ, chúng ta sử dụng hàm commit.

this.$store.commit("changeName", "New Name");

#Actions

Trong Vuex, các actions có cách hoạt động khá giống với Mutation, bởi vì chúng đều được sử dụng để thay đổi state. Tuy nhiên, actions không trực tiếp thay đổi giá trị của state. Thay vào đó, actions sẽ commit các mutations.

Ngoài ra, trong khi mutations phải là hàm đồng bộ, actions thì không bắt buộc như vậy.

Trong hầu hết các trường hợp thì Vuex chấp nhập state là tham số chính, actions còn chấp nhận Context làm tham số. Với Context, chúng cho phép truy cập vào các thuộc tính của Vuex store (ví dụ: state, commit, getters).

Dưới đây là ví dụ về actions: đợi 2 giây rồi commit một changeName mutation.

actions: {
   changeName (context, payload) {
     setTimeout(() => {
       context.commit("changeName", payload);
     }, 2000);
   }
}

Tạm kết

Qua bài viết này, mình đã giới thiệu 3 cách để bạn có truyền dữ liệu giữa các Components: props, custom events, và Vuex store Tùy vào hoàn cảnh, thiết kế của ứng dụng mà bạn chọn cách làm phù hợp. Cũng có thể trong ứng dụng, bạn phải sử dụng cả 3 cách làm này.

Mình hi vọng, các bạn sẽ hiểu thêm về Vue, về Vuex. Hãy để lại bình luận của bạn ở bên dưới nhé. Mình luôn luôn chờ ý kiến của bạn.

Bài viết gốc được đăng tải tại vntalking.com

Xem thêm:

Xem thêm các việc làm IT hấp dẫn trên TopDev

IT cần rèn luyện kỹ năng làm việc nhóm như thế nào?

IT cần rèn luyện kỹ năng làm việc nhóm như thế nào?

Trong thời đại công nghệ số, ngành công nghệ thông tin (IT) đã trở thành một lĩnh vực quan trọng và không thể thiếu trong hầu hết các doanh nghiệp và tổ chức. Với sự phát triển nhanh chóng của công nghệ và sự phức tạp ngày càng tăng của các dự án IT, khả năng làm việc nhóm đã trở thành một yếu tố quyết định đến thành công trong ngành này. Điều đó đặt ra câu hỏi: IT cần rèn luyện kỹ năng làm việc nhóm như thế nào?

Hãy cùng tìm hiểu trong bài viết này nhé!

Lợi ích của kỹ năng làm việc nhóm trong lĩnh vực IT

kỹ năng làm việc nhóm trong lĩnh vực IT

Kỹ năng làm việc nhóm là một yếu tố quan trọng trong lĩnh vực công nghệ thông tin (IT) và mang lại nhiều lợi ích đáng kể. Dưới đây là một số lợi ích của việc phát triển kỹ năng làm việc nhóm trong lĩnh vực IT:

  • Tăng hiệu suất làm việc: Lĩnh vực IT thường liên quan đến các dự án phức tạp và đòi hỏi sự phối hợp giữa nhiều thành viên trong nhóm. Kỹ năng làm việc nhóm giúp tăng hiệu suất làm việc bằng cách phân chia công việc, tận dụng tài năng và kiến thức của từng thành viên để tạo ra một quy trình làm việc hợp lý.
  • Khả năng giải quyết vấn đề: Khi làm việc nhóm, các thành viên có thể cùng nhau tư vấn, trao đổi ý kiến và tìm ra các giải pháp sáng tạo cho những vấn đề này. Sự kết hợp của các ý kiến và kiến thức khác nhau giúp tăng cường khả năng tư duy đa phương diện và đưa ra quyết định tốt hơn.
  • Phát triển kỹ năng mềm: Giao tiếp hiệu quả, lãnh đạo, quản lý thời gian, khả năng làm việc trong môi trường đa dạng và linh hoạt là những kỹ năng mềm quan trọng mà bạn nên phát triển.
  • Tạo sự sáng tạo và đổi mới: Việc làm việc nhóm trong lĩnh vực IT tạo ra một môi trường đa ngành, nơi mà các ý tưởng mới có thể được thảo luận, chia sẻ và kích thích. Những điều này sẽ thúc đẩy sự sáng tạo và đổi mới, giúp nhóm IT tạo ra các giải pháp mới và nâng cao chất lượng công việc.
  • Xây dựng mối quan hệ và tăng cường tinh thần đồng đội: Làm việc trong một nhóm IT tạo ra cơ hội để xây dựng mối quan hệ đồng đội mạnh mẽ. Mối quan hệ tốt và tinh thần đồng đội sẽ thúc đẩy sự hỗ trợ và sự hài lòng trong công việc.

  Kỹ năng giao tiếp? Làm thế nào để cải thiện giao tiếp hiệu quả?

  4 cách thúc đẩy sự phát triển nhân viên tại công ty

IT cần rèn luyện kỹ năng làm việc nhóm như thế nào?

Để rèn luyện kỹ năng làm việc nhóm trong lĩnh vực IT, dưới đây là một số phương pháp  giúp bạn tiến bộ và trở thành một thành viên nhóm IT hiệu quả:

Tìm hiểu về môi trường làm việc nhóm trong IT: Nắm vững cách thức làm việc, quy trình và công nghệ được sử dụng trong team. Hiểu rõ vai trò của từng thành viên, nguyên tắc giao tiếp và quy định của dự án.

Giao tiếp hiệu quả: Kỹ năng giao tiếp là yếu tố quan trọng trong làm việc nhóm. Hãy lắng nghe mọi ý kiến và đặt câu hỏi để hiểu rõ hơn. Sử dụng cách giao tiếp rõ ràng, trôi chảy và tự tin.

kỹ năng làm việc nhóm trong lĩnh vực IT
Kỹ năng giao tiếp tốt giúp quá trình làm việc nhóm hiệu quả hơn rất nhiều

Phối hợp và chia sẻ kiến thức: Hãy chia sẻ kiến thức, kinh nghiệm và tài nguyên của mình với các thành viên khác trong nhóm. Tìm hiểu cách làm việc của từng thành viên và tận dụng tài năng của họ để cùng nhau đạt được mục tiêu chung.

Phân công công việc: Hãy phân công công việc một cách công bằng và hiệu quả. Xác định rõ nhiệm vụ và trách nhiệm của từng thành viên. Đồng thời, hãy tạo cơ hội cho các thành viên tham gia vào các dự án khác nhau để mở rộng kỹ năng và kiến thức của họ.

Việc làm IT Fresher dành cho bạn

kỹ năng làm việc nhóm trong lĩnh vực IT
Phân công nhiệm vụ phù hợp với năng lực từng người làm tăng hiệu quả công việc

Xây dựng lòng tin và tạo động lực: Tạo một môi trường làm việc thoải mái và đồng đều giữa các thành viên. Đồng thời, tạo động lực cho các thành viên thông qua việc công nhận thành tựu, khích lệ và hỗ trợ khi gặp khó khăn.

Thực hành qua các dự án thực tế: Để rèn luyện kỹ năng làm việc nhóm, không có gì tốt hơn là thực hành qua các dự án thực tế. Tham gia vào các dự án trong công ty, tổ chức hoặc tham gia các dự án mã nguồn mở để áp dụng và cải thiện kỹ năng làm việc nhóm của mình.

Học hỏi từ người khác: Tận dụng cơ hội xây dựng mạng lưới và học hỏi từ những người thành công trong ngành IT. Tham gia vào các cộng đồng trực tuyến, hội thảo, sự kiện và gặp gỡ những người có kinh nghiệm trong làm việc nhóm trong lĩnh vực IT. Họ có thể chia sẻ những bài học quý báu và gợi ý để phát triển kỹ năng làm việc nhóm của bạn.

Kết luận

Kỹ năng làm việc nhóm đóng vai trò quan trọng trong lĩnh vực công nghệ thông tin (IT). Nó không chỉ giúp tăng hiệu suất làm việc và khả năng giải quyết vấn đề mà còn phát triển các kỹ năng mềm quan trọng như giao tiếp, lãnh đạo, và quản lý thời gian. Hy vọng câu hỏi IT cần rèn luyện kỹ năng làm việc nhóm như thế nào đã có lời giải đáp.

Với sự phát triển không ngừng của công nghệ thông tin, kỹ năng làm việc nhóm trở thành yếu tố quan trọng giúp đảm bảo thành công của các dự án và tạo nên một môi trường làm việc tốt đẹp. Hãy nắm bắt và rèn luyện kỹ năng này để đạt được thành công và góp phần vào sự phát triển của ngành công nghệ thông tin.

TopDev tổng hợp

Có thể bạn quan tâm:

Xem thêm Top vị trí tuyển dụng IT trên TopDev

Top 5 câu hỏi phỏng vấn Site Reliability Engineer và cách trả lời

Top 5 câu hỏi phỏng vấn Site Reliability Engineer và cách trả lời

Site reliability engineer (viết tắt là SRE), chức danh này thường lạ lẫm với đa số anh em làm việc bên ngành lập trình, bài viết này sẽ cung cấp cho anh em cái nhìn rõ ràng SRE và phỏng vấn Site reliability engineer như thế nào?

Công việc của SRE là đảm bảo hệ thống hoạt động ổn định. Chưa có uptime thì thôi làm gì có downtime bao giờ?

Viết tới đây chắc một số anh em vẫn còn chưa nắm rõ SRE cụ thể là gì? Xin anh em đừng vội, cùng bắt đầu với câu hỏi phỏng vấn Site reliability engineer nha.

1. Vị trí site reliability engineer (SRE) là gì?

Câu hỏi phỏng vấn Site reliability engineer đầu tiên lạị hỏi vị trí đó là gì thì hơi kì. Tuy nhiên đối với vị trí SRE thì câu hỏi này không có gì là lạ.

Vị trí SRE có đôi điểm khác biệt so với các vị trí khác. Dẫn tới việc hiểu rõ công việc mà mình sẽ làm, nếu apply vào vị trí này sẽ làm gì là điều rất quan trọng.

Đầu tiên chưa bàn tới định nghĩa thì anh em biết cho dù có sử dụng techstack là gì, sử dụng cloud service như thế nào thì hệ thống đôi khi sẽ có lúc down. Tính là downtime. Ngoài thời gian do trục trặc hệ thống và các bên cung cấp, một số lỗi (bugs) cũng ảnh hưởng tới thời gian hệ thống hoạt động ổn định. Vậy vị trí SRE sinh ra với mục đích gì?

The site reliability engineer is responsible for the stability and performance of websites, mobile applications, web services, and other online services. They’re in charge of monitoring the performance of websites and apps to check for issues and make sure they’re running smoothly.
Site reliability engineer (thường gọi là kỹ sư độ tin cậy). Họ là người chịu trách nhiệm về tính ổn định và hiệu suất của các trang web, ứng dụng di động, dịch vụ web và các dịch vụ trực tuyến khác. Họ chịu trách nhiệm giám sát hiệu suất của các trang web và ứng dụng để kiểm tra các vấn đề và đảm bảo rằng chúng đang chạy trơn tru.

  8 Bước Trong Lộ Trình Trở Thành DevOps Engineer
  Làm thế nào để tìm được những "nhân tài" DevOps phù hợp nhất?

2. SRE và Devops khác nhau như thế nào?

Câu hỏi phỏng vấn Site reliability engineer đầu tiên đã cho anh em biết nhiệm vụ chính của SRE. Nhưng khổ cái là trách nhiệm giám sát hiệu suất và đảm bảo các ứng dụng, web hoạt động trơn tru nghe như là trách nhiệm của Devops.

Kì thực thì 2 vị trí này có gì khác nhau? Nếu có thì khác nhau như thế nào? Đầu tiên ta đi tới 2 điểm giống nhau về công việc và việc làm của 2 vị trí Devops và SRE.

DevOps and Site Reliability Engineer are the two terms used to describe a person who specializes in improving applications and services while they are being used.
Devops và Site Reliability Engineer là hai thuật ngữ được sử dụng để mô tả một người chuyên cải tiến các ứng dụng và dịch vụ trong khi chúng đang được sử dụng.

Thứ hai:

DevOps and Site reliability engineering are both important roles in modern IT organizations. However, there is a big difference between them. Devops và Site reliability engineering đều có vai trò quan trọng trong các tổ chức CNTT hiện đại. Tuy nhiên, có một sự khác biệt lớn giữa chúng.

2.1 Khác biệt chính

Tuy có trách nhiệm chung nhưng vẫn tồn tại một số khác biệt như sau:

DevOps SRE
Devops liên quan đến việc phát triển phần mềm có thể được cập nhật và sửa đổi trong khi phần mềm đang chạy. SRE thì ngược lại tập trung vào việc duy trì và chạy một ứng dụng hoặc dịch vụ.
DevOps thường sử dụng các công cụ tự động hóa để cải thiện quy trình làm việc của họ. SRE làm việc với cả công cụ tự động hóa và con người để đảm bảo dịch vụ tiếp tục hoạt động trơn tru.
DevOps quyết định lúc nào và cách thức phần mềm được xây dựng. SRE tập trung vào những gì xảy ra sau khi nó được xây dựng

Tham khảo tin tuyển dụng DevOps hấp dẫn trên TopDev

3. DHCP là gì? Sử dụng DHCP như thế nào?

Câu hỏi thứ ba phỏng vấn Site reliability engineer liên quan tới protocols. Tuy nhiên anh em lưu ý câu hỏi chỉ là câu hỏi ví dụ.

Về các kiến thức khác liên quan tới kĩ thuật, anh em cố gắng cập nhật hoặc ôn lại chuẩn bị trước khi phỏng vấn.

Đầu tiên DHCP là viết tắt của Dynamic Host Configuration Protocol. Giao thức này cho phép phân bố các IP động trong mạng máy tính (networks). DHCP sử dụng để gán các địa chỉ IP address cho các thiết bị (PCs, các thiết bị mạng).

Về cơ bản khi một thiết bị kết nối vào mạng, nó sẽ cần IP để truy cập internet. Trong trường hợp này DHCP là bên quản lý và cấp phát các IP động tới từng thiết bị. Đảm bảo cho network hoạt động thông suốt

4. Bạn sẽ xử lý như thế nào trong trường hợp hệ thống có sự cố?

Câu hỏi thứ 4 phỏng vấn Site reliability engineer là kinh nghiệm thực tế trong quá trình làm việc.

Qua câu hỏi thứ nhất, anh em cũng đã hiểu trách nhiệm, công việc cần làm của SRE, vậy trường hợp có sự cố, SRE sẽ xử lý sự cố như thế nào?

Câu hỏi này tập trung vào kỹ năng ở các nhóm chính, cũng có thể nói là các nhóm công cụ chính sử dụng trong quá trình làm việc. Đơn cử có thể liệt kê theo các nhóm sau:

    • Metrics và Monitoring
    • Capacity và Planning
    • Change Management
    • Emergency Response

phỏng vấn Site reliability

Vậy trong trường hợp có sự cố, bằng việc sử dụng kết hợp các nhóm kể trên. SRE có thể dễ dàng nhanh chóng phát hiện sự cố. Trường hợp không thể xử lý sự cố một mình, SRE có thể yêu cầu trợ giúp từ dev team, devops team. Với các thông tin đánh giá sự cố đã có sẵn.

5. Horizontal và Vertical Scaling khác nhau như thế nào?

Câu hỏi thứ 5 và cũng là câu hỏi cuối cùng phỏng vấn Site reliability engineer liên quan tới scale hệ thống. Tất nhiên câu hỏi này đôi khi không phải là trách nhiệm chính của SRE.

Tuy nhiên, kiến thức về scale và các hệ thống lớn luôn là điểm cộng khi tham gia phỏng vấn SRE. Dữ liệu càng ngày càng nhiều.

Về cơ bản thì Vertical Scaling (scale theo chiều dọc) là quá trình mở rộng hệ thống bằng cách tăng tài nguyên của chính hệ thống đó. Việc tăng tài nguyên có thể được hiểu là RAM, CPU, Chip. Các thiết bị phần cứng khác có liên quan.

Ở chiều ngược lại, Horizontal Scaling (scale theo chiều ngang) nói tới việc thêm các virtual machine trong cùng 1 host. Tạo ra nhiều hơn các instance nằm ngang cùng cấp với nhau.

Cả hai loại hình scale đều có điểm yếu và điểm mạnh. Anh em có thể tìm hiểu thêm thông tin để biết trong trường hợp có xảy ra sự cố, sẽ cần xử lý như thế nào cho từng loại hệ thống lớn.

6. Tham khảo thêm câu hỏi phỏng vấn Site reliability engineer

Để chuẩn bị tốt cho buổi phỏng vấn Site reliability engineer. Anh em có thể tham khảo thêm các bài viết dưới đây:

Cảm ơn anh em đã đọc bài – Thank you so much for your time – Happy coding!

Tác giả: Kiên Nguyễn

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Infrastructure as code (IaC)

Bài viết đến từ anh Bùi Nguyễn Huy Hoàng – Quản lý DevSecOps DevSecOp team @Techcombank

Techcombank

I. Tại sao lại sử dụng Infrastructure as Code?

Những công việc như ảo hóa, điện toán đám mây (Cloud), container, tự động hóa (CI/CD) giúp đơn giản hóa công việc vận hành hành công nghệ thông tin (IT Operations). Việc triển khai, cấu hình, cập nhật và vận hành dịch vụ sẽ tiêu tốn ít thời gian và công sức hơn. Vấn đề sẽ được phát hiện và giải quyết nhanh chóng, các hệ thống luôn được cấu hình và cập nhật một cách đồng nhất. Những kỹ sư IT sẽ tiết kiệm được thời gian trong công việc vận hành hàng ngày, để có thể nhanh chóng thay đổi, học hỏi và cải tiến bản thân đáp ứng nhu cầu thay đổi liên tục của thế giới công nghệ.

Tuy nhiên, ngay cả với những công cụ và nền tảng mới nhất, các nhóm vận hành công nghệ vẫn thấy họ không thể đáp ứng nổi khối lượng công việc hàng ngày của mình. Họ không có thời gian để sửa chữa các vấn đề đã tồn tại lâu đời trong hệ thống cũ, chưa thể tái cấu trúc và tận dụng tối đa các công cụ và công nghệ mới. Trên thực tế thì việc dễ dàng khởi tạo tài nguyên trên Cloud sẽ khiến tình hình trở nên tồi tệ hơn. Do việc triển khai hạ tầng mới quá dễ dàng dẫn đến việc danh mục hệ thống và tài nguyên cần vận hành ngày càng tăng lên, điều này khiến việc duy trì mọi thứ ổn định đòi hỏi một lượng thời gian ngày càng lớn. Việc quản lý thay đổi một cách nhất quán và đáng tin cậy là một thách thức nan giải và cần có những quy trình, công cụ, thói quen để có thể giải quyết được vấn đề đó.

Một số công ty công nghệ đã đối mặt với thách thức này bằng cách áp dụng lại các quy trình, cấu trúc quản trị mà họ đã từng sử dụng để quản lý hạ tầng và phần mềm trước khi dịch vụ Cloud được trở nên phổ biến. Nhưng hạn chế là các nguyên tắc và quy trình này thường mất từ vài ngày đến vài tuần để có thể được chấp thuận triển khai tài nguyên mới, trong khi chỉ mất vài phút hoặc vài giây để triển khai trên Cloud. Các quy trình quản lý tài nguyên này thường bị bỏ qua hoặc xin sự chấp thuận ngoại lệ để không phải tuân theo từ nhóm những người cần hoàn thành công việc. Các công ty áp dụng thành công hơn thì lại cảm thấy đang bị thụt lùi do bị các đối thủ linh hoạt về công nghệ vượt mặt.

Các phương pháp quản lý cũ đã không thể đáp ứng được với tốc độ thay đổi do điện toán đám mây và tự động hóa mang lại. Nhưng vẫn cần phải giải quyết vấn đề về kiểm soát sự thay đổi và phát triển liên tục mà điện toán đám mây mang lại. Đó là lúc Infrastructure as Code(IaC) xuất hiện.

II. Infrastructure as Code là gì?

Infrastructure as Code là một phương phát tự động hóa hạ tầng dựa trên những nguyên lý của quá trình phát triển phần mềm, sử dụng các đoạn mã để khởi tạo, cung cấp các tài nguyên trong những trung tâm dữ liệu vật lý và các nền tảng Cloud một cách tự động, thay vì cài đặt và cấu hình thủ công. Nó tập trung vào các quy trình có tính lặp đi lặp lại và nhất quán cho việc cung cấp và thay đổi tài nguyên trên Cloud và cấu hình của chúng. Những thay đổi được thực hiện sẽ đi qua quá trình kiểm thử và xác thực kỹ lưỡng trước khi được đưa vào áp dụng.

Tiền đề việc này là những công cụ mới có thể xử lý tài nguyên hạ tầng như xử lý phần mềm và dữ liệu. Điều này cho phép áp dụng các công cụ, quy trình phát triển phần mềm như các hệ thống kiểm soát phiên bản (Version Control System), kiểm thử tự động và điều phối việc triển khai hạ tầng. Nó cũng mở ra cơ hội cho việc áp dụng các quy chuẩn phát triển phần mềm vào việc triển khai hạ tầng như Test Driven Design (TDD), tự động hóa(CI/CD).

Infrastructure as Code đã chứng minh được sự hữu dụng của mình trong những nơi có những yêu cầu cao về môi trường phát triển/triển khai và phát triển nhanh về công nghệ. Đối với ngân hàng số như Techcombank, các hệ thống công nghệ thông tin không chỉ là Business Critical mà chính là Business. Việc gián đoạn dịch vụ là không thể chấp nhận vì hệ thống ngân hàng xử lý hàng triệu giao dịch mỗi ngày. Vì vậy không có gì ngạc nhiên khi Techcombank đang tiên phong trong việc áp dụng các công nghệ mới, giải pháp mới để tăng tính tin cậy cho hạ tầng công nghệ thông tin quy có mô lớn.

Mục tiêu của việc áp dụng Infrastructure as Code trong Techcombank:

  • Khuyến khích sự thay đổi của hệ thống công nghệ thông tin.
  • Các kỹ sư công nghệ có thể dành thời gian cho các công việc quan trọng và phát triển năng lực của bản thân thay vì tốn thời gian cho những công việc nhỏ lặp đi lặp lại.
  • Bản thân người có nhu cầu (thường là project team) có thể chủ động xác định, cung cấp, quản lý các tài nguyên họ cần mà không cần sự giúp đỡ từ các kỹ sư vận hành (IT Operation).
  • Hạ tầng có thể dễ dàng phục hồi nhanh chóng sau sự cố.
  • Các cải tiến, nâng cấp được áp dụng và thực hiện liên tục thay vì thông qua các dự án đắt đỏ và rủi ro.
  • Các giải pháp cho vấn đề hạ tầng có thể được chứng minh thông qua kiểm thử, triển khai, đo lường tự động thay vì thông qua các cuộc họp và tài liệu.

III. Lợi ích của Infrastructure as Code

1. Tự động hóa hạ tầng công nghệ thông tin

Infrastructure as Code giúp tự động hóa các hoạt động liên quan đến hạ tầng công nghệ thông tin, bao gồm việc khởi tạo, cài đặt, triển khai, quản lý và giám sát hạ tầng thông qua mã nguồn. Với Infrastructure as Code, các nhóm phát triển không cần thực hiện các thao tác này thủ công, giảm thiểu thời gian và chi phí trong việc triển khai và quản lý hạ tầng. Việc tự động hóa này giúp đẩy nhanh quá trình cung cấp hạ tầng cũng như giảm thiểu rủi ro, khi hạn chế được tối đa sự can thiệp thủ công, đảm bảo tính ổn định của hạ tầng.

2. Kiểm soát phiên bản

Infrastructure as Code cho phép quản lý phiên bản, giúp các kỹ sư vận hành liên tục phát triển và quản lý đảm bảo tính nhất quán, kiểm soát các thay đổi. Khi sử dụng mã nguồn để quản lý hạ tầng, các phiên bản của mã nguồn đóng vai trò rất quan trọng trong việc kiểm soát và quản lý các thay đổi. Các phiên bản được theo dõi và đảm bảo rằng người dùng (đội dự án) đang sử dụng phiên bản mới nhất và người quản lý hạ tầng (đội vận hành) có thể xác minh tính nhất quán của hạ tầng và mối liên kết, liên quan, thay đổi giữa các phiên bản hạ tầng khác nhau. Từ đó có thể kiểm tra, giải quyết những vấn đề phát sinh liên quan đến việc triển khai sản phẩm.

3. Sản xuất nhanh

Infrastructure as Code cho phép các nhóm phát triển triển khai sản phẩm/ứng dụng một cách nhanh chóng và hiệu quả hơn. Khi việc cài đặt, triển khai hạ tầng được tự động hóa, các nhóm phát triển có thể giảm thiểu thời gian sản xuất và đưa được sản phẩm đến với khách hàng một cách nhanh chóng hơn. Điều này là rất quan trọng để đáp ứng kịp thời nhu cầu của khách hàng và tạo ưu thế cạnh tranh trong thị trường công nghệ khốc liệt hiện tại.

4. Xác định sự thay đổi

Infrastructure as Code giúp các nhóm vận hành xác định và quản lý sự khác biệt giữa các phiên bản hạ tầng. Chỉ cần kiểm tra phiên bản mới nhất và so sánh với phiên bản trước đó, các nhóm phát triển có thể xác định sự khác nhau và đưa ra các điều chỉnh cần thiết để giảm thiểu rủi ro trong việc triển khai. Điều này giúp giảm thiểu rủi ro, đảm bảo tính nhất quán của việc cài đặt và triển khai hạ tầng.

5. Tăng tính linh hoạt

Infrastructure as Code cho phép các tổ chức có thể nhanh chóng thay đổi hạ tầng mà không cần lo ngại về tính linh hoạt. Các yêu cầu mới có thể được triển khai nhanh chóng và có tính nhất quán với các phiên bản trước đó. Do đó, Infrastructure as Code trở thành một giải pháp hiệu quả cho các tổ chức muốn mang lại tính linh hoạt trong kinh doanh.

6. Giảm thiểu rủi ro

Infrastructure as Code giúp các tổ chức có thể giảm thiểu rủi ro liên quan đến cài đặt hạ tầng, đảm bảo tính nhất quán trong việc triển khai. Infrastructure as Code cho phép các nhóm thực hiện kiểm tra tự động, đảm bảo rằng hạ tầng đang hoạt động chính xác và ổn định. Sự hỗ trợ của Infrastructure as Code giúp đảm bảo tính toàn vẹn và độ tin cậy cho hạ tầng công nghệ thông tin.


Thuộc dự án Inside GemTechnology do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!

 

Các cơ hội việc làm tại Techcombank


Bài viết liên quan

Hơn cả một phương pháp, DevSecOps chính là “triết lý bảo mật” tại Techcombank

Là một thành viên mới tại Techcombank, anh Bùi Nguyễn Tuấn Minh hiện đang là Giám đốc DevSecOps, đây cũng là công việc đầu tiên của anh sau những năm tháng làm việc tại Singapore. Anh cũng là một trong những người góp phần mang lại những góc nhìn mới trong các phương pháp phát triển phần mềm của Techcombank. Được biết, Techcombank là một trong những đơn vị tiên phong ứng dụng phương pháp DevSecOps trong việc phát triển sản phẩm. Đây cũng được xem là một trong những định hướng giúp các ngân hàng số hóa và phát triển mạnh mẽ trong tương lai. Sau đây là những chia sẻ của anh Bùi Nguyễn Tuấn Minh về công việc DevSecOps tại Techcombank. Anh có thể chia sẻ một chút về môi trường làm việc tại Techcombank? Khi chuyển công tác từ Singapore về Việt Nam, mình nhận thấy môi trường và cách thức làm việc [...]

DevSecOps Philosophy (Triết lý DevSecOps)

Bài viết đến từ Ngô Doãn Thông - DevSecOps Engineer    DevSecOps team @Techcombank Giới thiệu Trong 20 năm qua, DevOps đã cùng với Agile, thay thế cho mô hình phát triển Waterfall. Microservices được coi là công nghệ tiên tiến nhất để triển khai kiến trúc dịch vụ. Thời gian phát triển sản phẩm đã được giảm đi, triển khai tự động được thực hiện hàng tuần hoặc hàng ngày và cloud thì cung cấp khả năng tính toán, cơ sở hạ tầng, lưu trữ và mạng rất mạnh mẽ. Triết lý DevOps thường được tóm tắt bằng khẩu hiệu "move fast and break things", điều này có nghĩa là triển khai mọi thứ nhanh hơn, mạnh dạn hơn và sẵn sàng, phá bỏ các cấu trúc silo, rào cản, chấp nhận rủi ro và khắc phục nhanh từ những rủi ro đó. Tuy nhiên, có một yếu tố quan trọng chưa được đề cập tới. Các tổ chức áp dụng DevOps vẫn cần đáp ứng tiêu chuẩn an [...]

Ngôn ngữ lập trình nào lương cao nhất năm 2023?

Ngôn ngữ lập trình nào lương cao nhất năm 2023?

Sự phát triển mạnh mẽ của ngành công nghệ thông tin và nhu cầu ngày càng cao về nguồn nhân lực đã mang lại nhiều cơ hội việc làm cùng với mức lương hấp dẫn cho lập trình viên. Tuy nhiên, với đa dạng ngôn ngữ lập trình như hiện nay, không phải ngôn ngữ nào cũng đem lại thu nhập cao cho lập trình viên. Điều này đặt ra câu hỏi quan trọng: Ngôn ngữ lập trình nào lương cao nhất?

Yếu tố nào ảnh hưởng đến lương lập trình viên?

MỨC LƯƠNG LẬP TRÌNH VIÊN @TRÌNH ĐỘ & LĨNH VỰC
Mức lương của lập trình viên theo trình độ & lĩnh vực (Báo cáo thị trường IT 2022 của TopDev)

Mức lương của lập trình viên được ảnh hưởng bởi nhiều yếu tố, bao gồm:

  • Nhu cầu thị trường: Các ngành như công nghệ thông tin, phát triển phần mềm, trí tuệ nhân tạo và khoa học dữ liệu đang trở thành những lĩnh vực có nhu cầu lớn về lập trình viên, dẫn đến cạnh tranh cao và mức lương hấp dẫn.
  • Phạm vi ứng dụng: Các ngôn ngữ lập trình có ứng dụng rộng rãi và đa dạng trong nhiều lĩnh vực như web development, mobile, game, trí tuệ nhân tạo, hệ thống nhúng và phân tích dữ liệu có thể đem lại thu nhập cao. Những ngôn ngữ phổ biến trong các lĩnh vực này thường được ưu tiên và trả lương cao hơn.
  • Độ phổ biến: Các ngôn ngữ được sử dụng rộng rãi và có cộng đồng lớn, hỗ trợ mạnh mẽ từ cộng đồng phát triển, thường có nhiều cơ hội việc làm và mức lương tương đối cao. Ngôn ngữ như Python, JavaScriptJava là những ngôn ngữ rất phổ biến và thường đi kèm với mức lương hấp dẫn.
  • Mức độ phức tạp: Các ngôn ngữ lập trình có mức độ phức tạp cao, đòi hỏi kiến thức chuyên sâu và kỹ năng đặc biệt, thường được đánh giá cao hơn và được trả lương tương xứng. Ví dụ, ngôn ngữ C++ được sử dụng phổ biến trong lĩnh vực nhúng và phát triển game, và các chuyên gia C++ thường nhận được mức lương cao.
  • Kinh nghiệm: Kinh nghiệm của lập trình viên cũng ảnh hưởng đến mức lương. Những lập trình viên có kinh nghiệm và thành tựu trong công việc thường nhận được mức lương cao hơn so với những người mới vào nghề.

  Người mới bắt đầu nên học ngôn ngữ lập trình nào?

Ngôn ngữ lập trình nào lương cao nhất?

Ngôn ngữ lập trình Scala

Ngôn ngữ lập trình Scala

Scala là một trong những ngôn ngữ lập trình có mức lương cao nhất hiện nay, trung bình mỗi năm một người có thể kiếm được $92,780 (Theo “Developer Survey 2022).

Đây là một ngôn ngữ lập trình đa mô hình (multi-paradigm) chạy trên nền tảng Java Virtual Machine (JVM). Nó kết hợp các tính năng của ngôn ngữ hướng đối tượng và lập trình hàm, mang lại khả năng viết mã linh hoạt và mạnh mẽ.

Scala đã thu hút sự quan tâm và sử dụng rộng rãi trong các dự án phát triển phần mềm lớn và hệ thống phân tán. Mức lương của lập trình viên Scala có thể cao nhờ vào các yếu tố sau:

  • Độ phổ biến: Mặc dù không phải là ngôn ngữ phổ biến như Python hoặc JavaScript, Scala vẫn có một cộng đồng người dùng đáng kể và được sử dụng trong các dự án lớn. Điều này tạo ra một cạnh tranh cân bằng giữa nguồn cung và nhu cầu, giúp tăng khả năng nhận mức lương cao.
  • Phạm vi ứng dụng: Scala thường được sử dụng trong các lĩnh vực như phân tích dữ liệu, xử lý dữ liệu lớn (big data), phát triển hệ thống phân tán và ứng dụng web. Với sự gia tăng của các công ty hoạt động trong các lĩnh vực này, lập trình viên Scala có thể tận dụng cơ hội việc làm và nhận mức lương cao.
  • Kỹ năng chuyên môn: Scala là một ngôn ngữ phức tạp và yêu cầu kiến thức chuyên sâu để sử dụng hiệu quả. Lập trình viên có kỹ năng chuyên môn vượt trội trong Scala, cùng với khả năng áp dụng nó vào các dự án thực tế, có thể đạt được mức lương cao hơn.

Ngôn ngữ lập trình Perl

Tiếp theo trong danh sách ngôn ngữ lập trình nào lương cao nhất chính là Perl. Ngôn ngữ lập trình này có mức lương trung bình khoảng $90,073/năm (Theo “Developer Survey 2023). 

Perl là một ngôn ngữ lập trình cấp cap, được phát triển vào những năm 1980. Với các tính năng như xử lý chuỗi và hỗ trợ mạnh mẽ cho các tác vụ hệ thống, Perl đã được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau.

Mức lương của lập trình viên Perl cũng phụ thuộc vào nhiều yếu tố, bao gồm:

  • Kỹ năng và kinh nghiệm: Lập trình viên Perl có kỹ năng chuyên sâu và kinh nghiệm phong phú trong việc sử dụng Perl có thể nhận được mức lương cao hơn. Sự am hiểu sâu về các tính năng và thư viện của Perl cùng với khả năng áp dụng hiệu quả vào các dự án thực tế có thể tạo ra giá trị cho nhà tuyển dụng.
  • Phạm vi ứng dụng: Dù Perl không còn được sử dụng rộng rãi như trước đây, nó vẫn được sử dụng trong một số lĩnh vực như quản lý hệ thống, xử lý văn bản và biểu đồ. Lập trình viên Perl có thể tìm cơ hội việc làm và nhận mức lương cao hơn trong các dự án và công ty tập trung vào những lĩnh vực này.

Tổng hợp các việc làm Back-end đang tuyển trên TopDev

Ngôn ngữ lập trình Golang

Ngôn ngữ lập trình Golang

Mức lương trung bình mà một lập trình viên thành thạo ngôn ngữ Golang có thể nhận được là $89,204/năm. Đây là một ngôn ngữ lập trình mã nguồn mở do Google phát triển. Go được thiết kế với mục tiêu đơn giản, hiệu quả và dễ sử dụng cho việc phát triển ứng dụng.

Golang đã thu hút sự quan tâm của cộng đồng lập trình và công ty công nghệ, và trở thành một ngôn ngữ phổ biến trong lĩnh vực phát triển phần mềm và hệ thống. Dưới đây là một số yếu tố ảnh hưởng đến mức lương của lập trình viên Golang:

  • Độ phổ biến và cộng đồng: Golang đã có sự phát triển đáng kể trong thời gian gần đây, với một cộng đồng người dùng ngày càng lớn. Sự phổ biến và tăng trưởng của Golang tạo ra cơ hội việc làm và cạnh tranh, ảnh hưởng đến mức lương của lập trình viên.
  • Phạm vi ứng dụng: Golang được thiết kế để tăng cường hiệu suất và xử lý đồng thời. Với khả năng đáp ứng tốt trong việc xây dựng hệ thống phân tán, dịch vụ web và ứng dụng đám mây, lập trình viên Golang có cơ hội nhận mức lương cao trong các dự án có liên quan.
  • Kỹ năng chuyên môn: Sự am hiểu sâu về ngôn ngữ Golang và khả năng áp dụng nó vào việc phát triển các dự án thực tế sẽ tạo ra giá trị cho nhà tuyển dụng. Lập trình viên có kỹ năng chuyên môn vượt trội trong Golang, bên cạnh kiến thức về các công nghệ liên quan, có thể có cơ hội nhận mức lương cao hơn.

Ngôn ngữ lập trình Rust

Ngôn ngữ lập trình Rust

Nếu bạn hỏi ngôn ngữ lập trình nào lương cao nhất thì chắc chắn không thể bỏ qua Rust. Mức lương trung bình một lập trình viên Rust có thể nhận được là $87,047/năm. Ngôn ngữ lập trình này được phát triển bởi Mozilla với mục tiêu bảo mật, hiệu năng cao và kiểm soát bộ nhớ an toàn. Rust đã thu hút sự quan tâm và sử dụng rộng rãi trong cộng đồng lập trình viên và công ty công nghệ.

Dưới đây là một số yếu tố ảnh hưởng đến mức lương của lập trình viên Rust:

  • Độ phổ biến và cộng đồng: Mặc dù Rust không phổ biến như các ngôn ngữ như Python hay JavaScript, nhưng nó đang dần trở nên phổ biến hơn. 
  • Tính bảo mật và hiệu năng: Rust được thiết kế để cung cấp bảo mật cao và hiệu năng tối ưu. Với khả năng tránh được các lỗi thông thường liên quan đến bộ nhớ và thread, Rust thường được sử dụng trong các dự án yêu cầu tính bảo mật cao và hiệu năng tốt. 
  • Kỹ năng chuyên môn: Rust là một ngôn ngữ phức tạp và yêu cầu kiến thức chuyên sâu để sử dụng hiệu quả. Lập trình viên có kỹ năng chuyên môn vượt trội trong Rust, cùng với khả năng áp dụng nó vào các dự án thực tế, có thể đạt được mức lương cao hơn.
  • Phạm vi ứng dụng: Rust thường được sử dụng trong các lĩnh vực như phát triển hệ thống nhúng, phát triển hệ thống phân tán và ứng dụng có yêu cầu bảo mật cao. Với sự gia tăng của các công ty hoạt động trong các lĩnh vực này, lập trình viên Rust có thể tận dụng cơ hội việc làm và nhận mức lương cao.

Ngôn ngữ lập trình Objective-C

Đứng cuối cùng trong danh sách các ngôn ngữ lập trình có mức lương cao nhất chính là Objective-C. Thu nhập của lập trình viên Objective-C rơi vào khoảng $83,165/năm (Theo “Developer Survey”).

Đây là một ngôn ngữ lập trình hướng đối tượng được sử dụng phổ biến trong việc phát triển ứng dụng cho các hệ điều hành của Apple, bao gồm macOS và iOS. Ngôn ngữ này đã trở thành một phần quan trọng trong việc xây dựng ứng dụng di động và các ứng dụng máy tính cá nhân của Apple.

Mức lương của lập trình viên Objective-C có thể phụ thuộc vào một số yếu tố sau:

  • Độ phổ biến: Objective-C đã được sử dụng rộng rãi trong nhiều năm đối với việc phát triển ứng dụng iOS và macOS. Tuy nhiên, trong những năm gần đây, ngôn ngữ Swift đã trở thành ngôn ngữ chính thức cho phát triển ứng dụng của Apple, và sự phổ biến của Objective-C đã giảm đi. Do đó, tìm kiếm việc làm với Objective-C có thể khó hơn và có thể ảnh hưởng đến mức lương.
  • Kinh nghiệm và kỹ năng chuyên môn: Lập trình viên Objective-C có kinh nghiệm và kỹ năng chuyên môn sâu về việc phát triển ứng dụng cho hệ điều hành Apple có thể nhận được mức lương cao hơn. 
  • Phạm vi ứng dụng: Objective-C thường được sử dụng trong việc phát triển ứng dụng di động và ứng dụng máy tính cá nhân cho hệ điều hành của Apple. Lập trình viên Objective-C có cơ hội nhận mức lương cao trong các dự án và công ty tập trung vào việc phát triển các ứng dụng cho các nền tảng này.

Bạn có thể tham khảo thêm về mức lương của lập trình viên theo công nghệ, theo trình độ & lĩnh vực và theo vị trí tại Báo cáo Thị trường IT 2022 của TopDev. hoặc tính lương Gross – Net thông qua công cụ tính lương miễn phí của TopDev:

Tính lương chuẩn với công cụ tính lương gross sang net từ TopDev

Kết luận

Bài viết đã cung cấp thông tin cho bạn về top các ngôn ngữ lập trình lương cao nhất. Tuy nhiên, để tìm được câu trả lời chính xác cho câu hỏi ngôn ngữ lập trình nào lương cao nhất còn phụ thuộc vào nhiều yếu tố. 

Để đạt mức lương cao, ngoài việc nắm vững một ngôn ngữ lập trình, quan trọng hơn là phát triển kỹ năng chuyên môn sâu trong lĩnh vực mà bạn quan tâm, có khả năng giải quyết các vấn đề phức tạp và đóng góp vào các dự án có giá trị cao. Chúc bạn sớm tìm được công việc lương cao và phù hợp với mình.

Tổng hợp bởi TopDev

Xem thêm:

Tìm kiếm việc làm IT mới nhất tại TopDev!

Mất bao lâu để trở thành lập trình viên quốc tế?

Mất bao lâu để trở thành lập trình viên quốc tế?

Bài viết được sự cho phép bởi tác giả Sơn Dương

Trong chúng ta chắc hẳn đã từng nghe về một “quy tắc” nói rằng để trở thành một chuyên gia trong một lĩnh vực nào đó bạn phải mất 10,000 giờ. Vậy để trở thành lập trình viên quốc tế, bạn cần bao lâu? Có đúng là phải cần tới 10000 giờ?

Nghe đến đây, chắc hẳn nhiều bạn giật mình và chán nản. Thế này thì chết đói trước khi kiếm được tiền từ nghề lập trình viên. Tuy nhiên, bạn cũng đừng quá lo lắng, quy tắc này cũng không thực sự hoàn toàn đúng đâu.

Trong bài viết này, mình sẽ giải thích tại sao bạn không cần phải mất 10,000 giờ mà vẫn là chuyên gia lập trình.

Bắt đầu thôi chứ nhỉ!

Trở lại năm 2011, Malcolm Gladwell cho xuất bản cuốn “Những kẻ xuất chúng“(Outliers). Cuốn sách chia sẻ về cách mà những người thành công nhất trên thế giới đạt được địa vị xuất chúng.

Trong cuốn sách, Gladwell đã tranh luận rằng có một “kim chỉ nam” ở những bậc thầy đẳng cấp thế giới trong các lĩnh vực khác nhau. Đó chính là học thuyết 10,000 giờ.

Quy tắc 10,000 giờ là gì?

Phần lớn chúng ta khá quen thuộc với quy tắc này. Ngắn gọn mà nói, nó cho rằng để trở thành bậc thầy đẳng cấp thế giới trong mọi lĩnh vực, chúng ta cần luyên tập đúng cách trong 10,000 giờ.

Oh, thử xem nhé, bạn sẽ phải luyện tập có chủ đích trong 40 giờ mỗi tuần. Cần khoảng 52 tuần một năm (không tính những năm nhuận). Vậy, nếu bạn có điều kiện để trở thành người xuất chúng, bạn cần luyện tập 40 giờ mỗi tuần và khoảng 5 năm để thành bậc thầy trong lĩnh vực của bạn.

Cũng dễ hiểu khi Gladwell đã đơn giản hóa ý tưởng của mình để bán được nhiều sách hơn. Mình không có vấn đề gì về điều đó.

Nhưng có nhiều vấn đề cần phải suy nghĩ ở quy tắc 10,000 giờ này.

  Nghề lập trình viên có những ưu nhược điểm gì?

Một vấn đề thực sự làm tổn thương những người đang học lập trình.

Một vài năm trở lại đây, phương tiện truyền thông đã thay đổi ý nghĩa thực sự của quy tắc 10,000 giờ này.

Tưởng chừng như một trò chơi trên điện thoại vậy. Họ biến nghĩa của nó từ  “mất 10,000 giờ để trở thành một chuyên gia trong một lĩnh vực tiên tiến” sang ” mất 10,000 giờ chỉ để làm tốt một thứ gì đó”.

Mất bao lâu để trở thành lập trình viên quốc tế?

Nếu bạn muốn thành chuyên gia lập trình viên quốc tế, nghe tới điều này có thể làm bạn thấy chán nản.

Bạn có thể nghĩ rằng “mình sẽ không bao giờ có đủ thời gian để học lập trình” và thay đổi ngay sang những công việc khác.

Việc làm IT Fresher dành cho bạn

Điều đó hoàn toàn sai lầm. Hãy cùng tìm hiểu tại sao nhé!

Chia sẻ chút xíu về mình nha. Trước khi bắt tay xây dựng trang web VNTALKING, mình đã từng làm lập trình viên tại nhiều công ty như Samsung, Panasonic…

Mình từng học ngành điện tử viễn thông tại đại học Bách Khoa Hà Nội. Hồi sinh viên, mình đã dành rất nhiều giờ để tìm hiểu kiến thức lập trình cơ bản như thuật toáncấu trúc dữ liệu

Việc hiểu các khái niệm nền tảng giúp mình được tuyển dụng vào các công ty. Đó cũng là lí do tại sao mình tập trung nhiều vào kiến thức nền tảng khi chia sẻ các kiến trên VNTALKING

  Top 6 nguyên lý thiết kế microservices cho lập trình viên có kinh nghiệm

Nhưng khi bước vào công việc lập trình thực sự, mình bắt đầu làm những việc mà chưa bao giờ được trải nghiệm thời sinh viên, có thể kể tới như:

  • Sử dụng Ruby, Rails hay Javascript để xây dựng các hệ thống phần mềm lớn.
  • Viết các kiểm thử tự động cho phần mềm.
  • Làm việc nhóm trên một codebase.

Vậy, tại sao các công ty đó lại tuyển mình khi mình không dành nhiều giờ (chắc chắn là không được 10,000 giờ) để học trước đó?

Họ thuê mình bởi công ty thuê những người lập trình như một sự đầu tư.

Tại sao lại vậy nhỉ?

Trong buổi phỏng vấn, nhà tuyển dụng sẽ không hỏi rằng bạn đã dành đủ 10,000 giờ để học lập trình hay chưa?

Đó là bởi vì họ không kì vọng bạn sẽ biết mọi thứ trong ngày đầu đâu.

Vậy, vào ngày đầu tiên đi làm, những điều mà các công ty mong đợi ở bạn là gì? Đó là:

Mất bao lâu để trở thành lập trình viên quốc tế?

Khi bạn dành nhiều thời gian hơn vào viết code, bạn sẽ nhận ra rằng: phần lớn các vấn đề đều có thể giải quyết được nếu bạn kiên trì tìm hiểu và nghiên cứu.

Một lập trình viên giỏi thường đặc biệt tốt 3 điều sau:

  • Tìm kiếm trên google.
  • Tự học những khái niệm mới rất nhanh.
  • Có khả năng tự sửa lỗi.

Tất nhiên, sẽ không hề tốn 10,000 giờ để giỏi những kĩ năng đó. Do đó, bạn sẽ không cần 10000 giờ để học lập trình cũng như trở thành một lập trình viên quốc tế.

Cách tốt nhất để đạt mục tiêu là không đếm giờ.

Vậy, nên tiếp tục việc học lập trình như thế nào? Một câu hỏi rất hay. Bài viết dưới đây, mình sẽ viết chi tiết làm thế nào để học code nhanh và hiệu quả nhất, các bạn đón đọc nhé.

Đam mê, kiên trì cùng sự trợ giúp của bạn bè và đồng nghiệp, bạn sẽ sớm có được thành công.

Nếu bạn có điều muốn chia sẻ, đừng ngần ngại để lại bình luận bên dưới nhé!

Bài viết gốc được đăng tải tại vntalking.com

Xem thêm:

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

Git Submodules và ứng dụng trong việc chia sẻ tài nguyên dùng chung

Git Submodules và ứng dụng trong việc chia sẻ tài nguyên dùng chung

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Trình quản lý gói (Package Manager) được tích hợp hay được tạo ra và sử dụng trong các ngôn ngữ lập trình là một cách hữu hiệu để chúng ta tái sử dụng mã được chia sẻ. Ví dụ như trong Javascript/Node.js có npm với hàng triệu packages được chia sẻ bởi rất nhiều lập trình viên trên thế giới. Mỗi khi cần gì, việc đầu tiên chúng ta thường làm là tìm xem có gói nào đáp ứng được nhu cầu để giảm thời gian phát triển phần mềm.

Việc chia sẻ các gói mà ai cũng có thể tìm kiếm và sử dụng đôi khi không phù hợp trong một số trường hợp, ví dụ chúng ta tạo ra các hàm tiện ích chỉ để sử dụng trong các dự án nội bộ của công ty hay cho riêng cá nhân mà không muốn chia sẻ với bất kì ai khác. Mặc dù nhiều trình quản lý gói cung cấp tính năng để “publish” các gói chia sẻ trong nội bộ, tuy nhiên điều đó vẫn có những hạn chế nhất định như chi phí, thời gian triển khai…

Trong git, có một tính năng gọi là submodule có thể giúp chúng ta giải quyết được trường hợp cần chia sẻ thư mục hoặc các tệp tin với nhau trong các repository, qua đó chúng ta không cần phải tốn nhiều công sức để chia sẻ những đoạn mã tiện ích giữa các dự án với nhau nữa. Chi tiết như thế nào thì hãy đọc tiếp bài viết dưới đây nhé.

Git submodule là gì?

Git Submodule là một tính năng mạnh mẽ trong Git cho phép thêm và quản lý các repository khác trong repository của bạn. Nó cung cấp một cách để tích hợp và theo dõi các phụ thuộc mã nguồn bên ngoài một cách dễ dàng.

Về cơ bản, một submodule là một kho lưu trữ Git được nhúng trong một kho lưu trữ Git khác. Nó hoạt động như một con trỏ chỉ đến một commit cụ thể trong một kho lưu trữ bên ngoài. Bằng cách sử dụng submodule, bạn có thể thêm và sử dụng thư viện mã nguồn bên ngoài, framework hoặc bất kỳ dự án nào khác như một thành phần của dự án.

Cách đơn giản nhất để hình dung submodule hoạt động là chia sẻ những đoạn mã dùng chung trong các dự án. Ví dụ, bạn tạo ra một repository chỉ chứa các tệp với các hàm tiện ích (utils), sau đó muốn sử dụng chúng trong một dự án khác thì chỉ cần tạo một thư mục liên kết đến repository tiện ích.

git submodules work

Việc tận dụng submodule mang lại cho chúng ta nhiều sự tiện lợi trong cộng tác và tái sử dụng mã, vì các submodule cũng là một kho lưu trữ git nên nó có thể được phát triển thêm tính năng, sửa lỗi, bảo trì… như các dự án thông thường khác. Khi muốn nhận thay đổi, chỉ cần một thao tác pull submodule về để lấy về mã mới nhất. Thậm chí chúng ta còn có thể tham gia phát triển submodule ngay trong dự án đang liên kết đến nó bằng cách truy cập vào thư mục chứa submodule và commit như bình thường.

  Biến Git và GitHub trở thành công cụ đắc lực cho Software Engineer

Ứng dụng trong việc chia sẻ tài nguyên dùng chung

Giả sử chúng ta đang ở thư mục dự án A và muốn thêm submodule là B có url: https://git-hub.com/2coffee/awesomelibrary

Thêm một submodule bằng lệnh add:

$ git submodule add https://git-hub.com/2coffee/awesomelibrary

Kiểm tra lệnh trên vừa làm gì:

$ git status

On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

 new file:   .gitmodules
 new file:   awesomelibrary

Git báo có 2 tệp mới được thêm vào, nó chứa chỉ dẫn cho submodule được liên kết.

  Git là gì mà lại giúp bạn và cả team làm việc tốt hơn?

Hãy thử mở file .gitmodules ra bạn sẽ thấy nội dung trông giống như là:

[submodule "awesomelibrary"]
 path = awesomelibrary
 url = https://git-hub.com/2coffee/awesomelibrary

Ngay bây giờ bạn có thể kiểm tra thư mục awesomelibrary và sử dụng các đoạn mã trong đó như nó thuộc về project.

Tham khảo Job FrontEnd HOT trên TopDev!

Tổng kết

Bên cạnh việc sao chép mã hay đóng gói mã thành thư viện để sử dụng trong một dự án nội bộ khác, chúng ta còn có thêm một cách nữa là sử dụng git submodule. Nó đơn giản là liên kết một dự án git khác vào một thư mục nào đó trong project hiện tại, qua đó có thể thoải mái nhận những thay đổi mới nhất từ nó mà không cần phải làm thêm nhiều bước.

Bài viết gốc được đăng tải tại 2coffee.dev

Xem thêm:

Tìm việc làm IT mới nhất trên TopDev

Shipit – Tự động deploy Javascript project

Shipit – Tự động deploy Javascript project

Bài viết được sự cho phép của tác giả Tùng Nguyễn

Để deploy 1 project Javascript đơn giản lên server (apache hoặc ngnix tuỳ sở thích các bạn) thì thường thường chúng ta phải làm các bước cơ bản như build local, zip file source, copy file zip lên server, unzip và chạy các câu lệnh cần thiết. Nếu lúc nào deploy chúng ta cũng tự làm mấy bước như thế này thì thật sự là khá mệt. Hôm nay tôi sẽ hướng dẫn các bạn cách deploy tự động 1 project Nodejs bằng Shipit. Thế Shipit là gì và sử dụng nó như thế nào,… tôi cũng sẽ giới thiệu luôn trong bài này luôn.

Shipit là gì?

Nói nôm na các bạn dễ hiểu, Shipit là công cụ tự động hoá các bước deploy dành cho các bạn Javascript developer. 1 dòng lệnh trong Shipit config ta coi như 1 task. Shipit sẽ thực hiện 1 flow tasks dựa trên package orchestrator, login và chạy các lệnh SSH trên server thông qua OpenSSH. Chúng ta có thể sử dụng Shipit để tự động hoá build và deploy cho hàng loạt các ứng dụng Nodejs.

Chuẩn bị:

Trong bài hướng dẫn này tôi sử dụng các tool như sau, các bạn có thể setup giống tôi hoặc thay thế bằng các tool, phần mềm tương tự cũng được:

  1. Server chạy Ubuntu hoặc Debian Linux và cài đặt rsync.
  2. Web server Apache.
  3. node và yarn được cài đặt trên môi trường development. Ở máy tôi đang cài Nodejs 14.19.0 và yarn 1.22.17 trên Ubuntu 21. Các bạn có thể tùy thích xài npm cũng được.
  4. Các bạn cũng cần cài rsync và git trên môi trường development.

  7 khái niệm Javascript cơ bản không thể bỏ qua

  Callback hell là gì? 6 cách “trị” callback hell trong javascript

Bước 1: Khởi tạo git repo

Cái này chắc ai cũng biết nên tôi sẽ không giới thiệu cách làm ở đây. Trong bài này tôi tạo 1 repo tên là Angular để cho các bạn dễ làm ví dụ, cũng như sau này các bài viết về Angular tôi cũng sẽ update vào đó để demo.

https://github.com/tungnt92/angular-demo.git

Bước 2: Cài đặt Shipit package

Việc đầu tiên cần làm chắc chắn là cài đặt Shipit vào project mà các bạn cần deploy. Ta thực hiện các bước như sau:

Tôi tạo 1 file package.json:

yarn init

Sau khi chạy command trên tôi được 1 file tên package.json như vầy, trong file này chứa các script như start application, build, clean up,… cũng như những thông tin cơ bản của application và các dependency cần thiết để chạy:

{
  "name": "angular-demo",
  "version": "1.0.0",
  "main": "index.js",
  "repository": "git@github.com:tungnt92/angular-demo.git",
  "author": "tungnt92 <nguyeentung@gmail.com>",
  "license": "MIT"
}

Sau đó tôi bắt đầu cài đặt Shipit, tôi chạy command sau:

yarn add --dev shipit-cli
yarn add --dev shipit-deploy

Các bạn lưu ý tôi sử dụng --dev để chỉ cho yarn thấy rằng tôi muốn cài package này ở development dependency. File package.json của tôi có nội dung cuối cùng như sau, các bạn có thể làm theo các bước trên hoặc đơn giản là copy file này cho nhanh.

{
  "name": "angular-demo",
  "version": "1.0.0",
  "main": "index.js",
  "repository": "git@github.com:tungnt92/angular-demo.git",
  "author": "tungnt92 <nguyeentung@gmail.com>",
  "license": "MIT",
  "devDependencies": {
    "shipit-cli": "^5.3.0",
    "shipit-deploy": "^5.3.0"
  }
}

Tham khảo việc làm JavaScript tại Hồ Chí Minh trên TopDev

Bước 3: Config shipit

Tôi đã viết sẵn 1 file shipit config với đầy đủ các chức năng mà tôi thấy cần thiết để deploy project javascipt nằm ở cuối bài viết. Các bạn có thể copy file này, sau đó sửa các config information cho phù hợp với project của mình.

Giờ tôi sẽ đi từng bước, đầu tiên tôi tạo file shipitfile.js ở root project với các init command sau:

module.exports = shipit => {
  require('shipit-deploy')(shipit)

  const stagingConfig = {
    deployUser: 'bitnami',
    key: 'doc/aws/server-staging.pem',
    deployTo: '/home/bitnami/htdocs/projects/',
  }

  // More default config goes here

  shipit.initConfig({
    staging: {
      ...stagingConfig,
      projectName: 'angular-demo',
      servers: ["bitnami@xxx.xxx.xxx.xxx"],
    },
  })
}

Chỗ này các bạn lưu ý các config sau:

  • stagingConfig: tôi gom các config nào giống nhau ở các môi trường lại, mục đích cho gọn gàng và dễ import và chỉnh sửa khi cần.
  • staging: alias của server mà tôi sẽ deploy project của mình lên. Các server alias thường sử dụng như production, development,…
  • projectName: định danh tên của project, chỗ này sẽ dùng để xác định thư mục deploy.
  • key: trong trường hợp này tôi tạo folder ./doc/aws/ để chứa các server key. Các bạn nhớ thêm vào git ignore của mình.

Sau đó tôi viết thêm task cần thiết cho việc deploy như build project, setup remote server,…

...
shipit.task("angular:deploy", async () => {
    let zipFileName = `${shipit.config.projectName}.zip`

    // Zip the dist folder into dist.zip package then remove the folder as we don't need it anymore
    await shipit.local(`cd dist && zip -r ../${zipFileName} ${shipit.config.projectName}`);

    // Create deployTo folder if it's not existed
    await shipit.remote(
      `sudo mkdir -p ${shipit.config.deployTo} && sudo chown -R ${shipit.config.deployUser}: ${shipit.config.deployTo}`
    );

    // // Copy dist.zip to servers
    await shipit.copyToRemote(zipFileName, shipit.config.deployTo);

    // // Remove the dist.zip
    await shipit.local(`rm ${zipFileName}`);

    // // remove old frontend files
    await shipit.remote(`rm -rf ${shipit.config.deployTo}/${shipit.config.projectName}/*`);

    // // On server, unzip the dist.zip file then remove the zip package
    await shipit.remote(
      `cd ${shipit.config.deployTo} && unzip -o ${zipFileName} && rm ${zipFileName}`
    );
  });

Các config mà bạn cần lưu ý:

  • angular:deploy: tôi đặt tên cho task mà tôi sẽ gọi lúc deploy.
  • Các task khác tôi đã để comment vào rồi, các bạn đọc trên đó.

Cuối cùng ta được file config như sau:

module.exports = function (shipit) {
  // Load shipit-deploy tasks
  require("shipit-deploy")(shipit);

  const stagingConfig = {
    deployUser: 'bitnami',
    key: 'doc/aws/server-staging.pem',
    deployTo: '/home/bitnami/htdocs/projects/',
  }

  shipit.initConfig({
    staging: {
      ...stagingConfig,
      projectName: 'angular-demo',
      servers: ["bitnami@xxx.xxx.xxx.xxx"],
    },
  })

  shipit.task("angular:deploy", async () => {
    let zipFileName = `${shipit.config.projectName}.zip`

    // Zip the dist folder into dist.zip package then remove the folder as we don't need it anymore
    await shipit.local(`cd dist && zip -r ../${zipFileName} ${shipit.config.projectName}`);

    // Create deployTo folder if it's not existed
    await shipit.remote(
      `sudo mkdir -p ${shipit.config.deployTo} && sudo chown -R ${shipit.config.deployUser}: ${shipit.config.deployTo}`
    );

    // // Copy dist.zip to servers
    await shipit.copyToRemote(zipFileName, shipit.config.deployTo);

    // // Remove the dist.zip
    await shipit.local(`rm ${zipFileName}`);

    // // remove old frontend files
    await shipit.remote(`rm -rf ${shipit.config.deployTo}/${shipit.config.projectName}/*`);

    // // On server, unzip the dist.zip file then remove the zip package
    await shipit.remote(
      `cd ${shipit.config.deployTo} && unzip -o ${zipFileName} && rm ${zipFileName}`
    );
  });
};

Đến đây về cơ bản tôi đã hoàn thành xong việc setup shipit. Tôi có thể deploy project lên môi trường staging bằng command sau:

./node_modules/.bin/shipit staging angular:deploy

Nhưng đặt trường hợp tôi muốn chạy thêm command gì đó ví dụ build application trước khi deploy, tôi phải chạy câu sau:

ng build angular --prod --aot && ./node_modules/.bin/shipit staging angular:deploy

Quá dài, việc ghi nhớ và gõ câu command dài như xe lửa như vậy với tôi là bất khả thi. Nên tôi làm thêm 1 bước là gom các command cần thiết vào cùng 1 file, sau này tôi chỉ cần execute file này khi muốn deploy, chỉnh sửa hay thêm bớt command cũng dễ dàng.

Tôi tạo folder sau ./deploy. Sau đó tạo file với tên theo cú pháp:

[project-name]-environment.sh

Ví dụ: angular-demo-staging.sh

Trong file đó tôi viết tất cả các command cần thiết vào:

#!/usr/bin/env bash
ng build angular --prod --aot && ./node_modules/.bin/shipit staging angular:deploy

Sau này bất cứ khi nào cần deploy staging tôi chỉ cần chạy command:

deploy/angular-demo-staging.sh

Chúc các bạn có thể có thêm chút kiến thức về auto deploy cho project javascript sử dụng shipit.

Happy Hacking

Bài viết gốc được đăng tải tại omatsuri.blog, biết thêm về tác giả tại LinkedIn

Xem thêm:

Đừng bỏ lỡ hàng loạt IT job tại TopDev

Data Modeling with DynamoDB: Single table design (Xây dựng mô hình dữ liệu với DynamoDB: Thiết kế bảng đơn lẻ)

Bài viết đến từ anh Vũ Tuấn Nghĩa – Quản lý cao cấp hoạch định dữ liệu Data Engineering team @Techcombank

DynamoDB là một dịch vụ cơ sở dữ liệu NoSQL cung cấp hiệu năng nhanh và nhất quán – có khả năng mở rộng và linh hoạt trong cách sử dụng. Khác với cơ sở dữ liệu quan hệ (RDMS), DynamoDB không sử dụng joins và các cấu trúc quan hệ khác để lưu trữ và truy vấn dữ liệu. Thay vào đó, bạn sẽ thiết kế table của mình theo Single design table – 1 table duy nhất phục vụ toàn bộ application hay service, việc này giúp hiệu suất đọc và ghi nhanh hơn ở scale lớn và giảm chi phí cloud.

Trong bài viết này, chúng mình sẽ khám phá các lợi ích và thách thức của việc sử dụng Single design table trong DynamoDB, cũng như cách Datalake ở Techcombank sử dụng để đáp ứng và tối ưu như cầu sử dụng.

Data Modeling with DynamoDB: Single table design

Single table design

Trong tài liệu trang chủ AWS có đề cập:

You should maintain as few tables as possible in a DynamoDB application. Having fewer tables keeps things more scalable, requires less permissions management, and reduces overhead for your DynamoDB application. It can also help keep backup costs lower overall.

Thật vậy, nhưng làm thế nào để hạn chế số lượng bảng hay thậm chí một bảng duy nhất cho toàn bộ application/service tuy nhiên vẫn đảm bảo được thiết kế đó phục vụ được tất cả nhu cầu?

Multi-table vs Single-table

Hãy nhìn vào ví dụ như sau:

Đây là cách làm thông thường khi thiết kế data ở các hệ thống RDMS, sử dụng các chuẩn Database Normalization(1NF, 2NF, 3NF,…).

Mindset khi thiết kế data dạng Multi-table là tư duy lưu trữ data đầu tiên, tối ưu trong việc lưu trữ và đáp ứng tất cả query patterns ở một hiệu năng (performance) trung bình.

Giờ hãy tiếp cận theo một hướng khác:

Know your query patterns first

Luôn tiếp cận bài toán với xu hướng dành nhiều thời gian để thu thập cách User sử dụng hệ thống của mình là như thế nào, các query patterns là gì.

…you shouldn’t start designing your schema for DynamoDB until you know the questions it will need to answer. Understanding the business problems and the application use cases up front is essential.

Giả dụ với bài toán bên trên, chúng ta có 2 query patterns là:

  1. Query thông tin Customer bằng email
  2. Query thông tin Order bằng Customer’s email

Khi đã có thông tin như trên, chúng ta đi vào kỹ thuật đầu tiên khi thiết kế Single-table:

Index overloading

Với Query pattern đầu tiên

  1. Composite primary key:

    a. pk – Partition key: email

    b. sk – Sort key: email

2. Attributes:

    a. name

    b. address

Cùng với table đó, để serving query pattern thứ 2 

  1. Composite primary key:

    a. pk – Partition key: email

    b. sk – Sort key: orderID

2. Attributes:

    a. order date

    b. order status

    c. order amount

Mỗi record sẽ có composite PK khác nhau để phục vụ cho từng query patterns. Nhờ indexes (partition key, sort key) giờ đây được sử dụng đa dạng, nhiều loại data giúp cho số lượng cần indexing giảm xuống, từ đó:

  • Tăng write performance: do ít index cần update lúc thực hiện write operation.
  • Giảm chi phí cloud: do ít index cần maintaining cho Database.

Comfort with De-normalized and Pre-join

Với đặc thù thiết kế của single-table, bạn phải làm quen với chuyện de-normalized trong lúc thiết kế schema, cũng như thực hiện pre-join data vào Attributes của 1 record nhiều nhất có thể – hạn chế round trip khi truy xuất data.

Single-table design at Datalake Techcombank

Agile vs Know your query pattern first

Hầu hết các dự án IT hiện nay đều theo đuổi mô hình Agile – chấp nhận sự thay đổi, vậy làm thế nào để thiết kế Single-table có thể thành hiện thực khi nó yêu cầu “Know your query pattern first”. Câu trả lời là nhờ có index overloading cộng với đặc thù flexible attributes của DynamoDB(NoSQL) chúng ta hoàn toàn có thể mở rộng thêm các query patterns. Có một số những tips trong quá trình sử dụng bọn mình có đúc kết được như sau:

  1. Prefix in PK and SK: như ví dụ bên trên với PK của customer email sẽ có prefix là “cemail#”, với SK của orderID sẽ có prefix là “orderid#”, việc này giúp việc về sau mở rộng indexes một cách dễ dàng và tránh bị trùng lặp do mình đã quy hoạch từ ban đầu.
  2. Update data trong Single-table sẽ phức tạp hơn, do data bị duplicate (attributes) ở các item với nhiều bộ Primary key khác nhau, do đó khi có 1 field data được update, bạn cần update tất cả các item ở các bộ Primary key chứa field đó.

Schema migration

Đây là một trong những bài toán phức tạp nhất trong quá trình vận hành DynamoDB (NoSQL) cùng với single-table design, việc schema upgrade thường xuyên xảy ra (thêm cột, thay đổi column type, thay đổi primary key,..) khiến như cầu schema migration một cách dễ dàng càng cần thiết:

  1. Schema migration cho attributes: do mang yếu tố flexible Attributes, mỗi Record là 1 object với schema độc lập, để có thể thêm cột ở tất cả các object, đòi hỏi phải scan tất cả các object để update. Nhược điểm là full scan để update sẽ tốn nhiều thời gian, và trong lúc đó table của mình sẽ ở trạng thái inconsistent, có những records đã được update, có records không.
  2. Schema migration cho việc thay đổi primary key: về bản chất việc thay đổi Partition key hay sort key thì DynamoDB sẽ tạo 1 record mới và xoá record cũ đi. Trong trường hợp này hãy cân nhắc sử dụng overloading-index nếu có thể, trong trường hợp bắt buộc phải chuyển sang Primary key mới làm tương tự như với schema migration.

Kết luận

Việc chọn sử dụng multi-table hay single-table phụ thuộc vào nhiều yếu tố, team đang muốn tối ưu điều gì, và hơn hết không có một giải pháp hoàn hảo nào giải quyết được tất cả các bài toán.

Ở Datalake của Techcombank, chúng tôi muốn tối ưu:

  • Thời gian của Engineers tập trung giải quyết các bài toán business, mà ít phải lo lắng đến việc vận hành servers.
  • Khả năng mở rộng, chi phí tối ưu sử dụng.
  • Mang đến trải nghiệm linh hoạt cho engineers.

Từ đó chúng tôi chọn DynamoDB cũng với Single-table design (một trong những storage stack của Datalake) để đáp ứng cũng như giải quyết các yêu cầu phát triển.


Thuộc dự án Inside GemTechnology do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!

Có thể bạn quan tâm:

Các cơ hội việc làm tại Techcombank


Bài viết liên quan

Data is all about orchestration (Tầm quan trọng của việc điều phối khi làm việc với dữ liệu)

Bài viết đến từ anh Vũ Tuấn Nghĩa - Quản lý cao cấp hoạch định dữ liệu Data Engineering team @Techcombank Data orchestration là một khối xây dựng cốt lõi của các hệ thống ETL dữ liệu, và là một công cụ đã có từ lâu đời và được áp dụng trong nhiều hệ thống khác nhau. Khi xây dựng Data Lake tại Techcombank, chúng mình có cơ hội thiết kế nhiều component/system từ đầu, từ hệ thống Data sourcing đến Datalake, đến hệ thống data ETL pipeline trên các zones của Data Lake. Để đáp ứng các nhu cầu và thách thức thực tế, ta cần có một hệ thống Data orchestration để giải quyết các bài toán: Cơ chế trigger các downstream job một cách linh hoạt mà không gây khó khăn trong quá trình vận hành Rút ngắn thời gian phát triển, xây dựng và kiểm thử Hạn chế sự phụ thuộc lẫn nhau gây ra chain failure Hôm nay chúng ta sẽ tìm hiểu về Data orchestration và cách giả [...]

Data Lake - Nền tảng lý trí cho mọi quyết định tài chính

Anh Nguyễn Quang Huy từng có kinh nghiệm nhiều năm về Khoa học dữ liệu cũng như phát triển và quản lý Hệ thống Dữ liệu lớn (Big Data) khi công tác tại các tập đoàn đa quốc gia tại tại Sing và Mỹ. Được truyền cảm hứng từ những bài toán lớn trên hành trình số hóa mà Techcombank đang giải quyết cho thị trường ngân hàng, Anh Nguyễn Quang Huy đã quyết định quay trở về Việt Nam để đồng hành với đội ngũ Techcombank trong giai đoạn chuyển đổi số mạnh mẽ nhất từ trước đến nay. Ở thời điểm hiện tại, anh đang giữ vị trí Director, Data Engineer tại Techcombank. Công việc chính của anh là phụ trách xây dựng các hoạt động, dự án liên quan đến Data Lake (Hồ dữ liệu) tại Techcombank. Hãy cùng nghe câu chuyện về Data Lake sẽ giải quyết những bài toán lớn nào cho hàng triệu khách hàng của Techcombank. Theo anh đâu là tầm quan trọ [...]