Home Blog Page 46

Lợi ích và những hạn chế khi sử dụng SSH Tunneling

Lợi ích và những hạn chế khi sử dụng SSH Tunneling

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

Vấn đề

Đôi khi chúng ta phân vân trong việc có nên xuất cổng (port) của cơ sở dữ liệu hay bất kì một dịch vụ nào đó ra ngoài mạng Internet để tiện cho việc kết nối và quản lý từ xa? Việc để lộ cổng ra ngoài như vậy không khác gì cho kẻ trộm nhìn thấy cửa nhà và ổ khóa, việc cần làm của chúng là tìm một “người thợ khóa” giỏi để có thể mở được cánh cửa đó trong thời gian sớm hay muộn mà thôi.

Chúng ta đều biết việc chỉ sử dụng username và password thôi là chưa đủ cho một hệ thống bảo mật. Vì chúng có nhiều cách để bị trộm mất mà người dùng không hề hay biết. Hiện nay các hệ thống hỗ trợ đăng nhập đã bổ sung thêm tính năng xác minh hai lớp, đăng nhập bằng mật khẩu dùng một lần, OTP… hay thậm chí là đăng nhập bằng khóa bí mật được tạo ra bởi những thuật toán phức tạp để bảo vệ người dùng tốt hơn.

SSH là một giao thức để đăng nhập và quản trị thiết bị từ xa, truyền tệp qua các mạng không đáng tin cậy. Có thể nói SSH là giao thức được sử dụng phổ biến nhất để đăng nhập và điều khiển một máy tính khác trên mạng Internet. SSH trở nên mạnh mẽ bởi ngoài việc sử dụng username & password thì nó còn hỗ trợ cả việc sử dụng SSH key khiến cho việc bẻ khóa là vô cùng khó.

Khi có trong tay một phiên SSH thì chúng ta có quyền thao tác với máy chủ bằng quyền hạn của người dùng đã được thiết lập trong hệ thống. Bao gồm cả việc ánh xạ một cổng TCP/IP bất kì của máy chủ về máy tính cá nhân. Tính năng này được gọi là SSH Tunneling, trong bài viết ngày hôm nay chúng ta sẽ tìm hiểu về SSH Tunneling.

SSH Tunneling là gì?

Từ tunnel trong tiếng anh dịch ra Tiếng Việt có nghĩa là là “đường hầm”. Đúng như tên của nó thì SSH Tunneling là đào một “đường hầm” thông qua ssh.

Sử dụng SSH Tunneling chúng ta có thể chuyển tiếp bất kì cổng TCP/IP nào từ máy chủ về máy khách và bảo mật đường truyền đó.

Ví dụ bạn có một máy chủ A ở địa chỉ IP x.x.x.x có cài MySQL Server sử dụng cổng 3306. A đã cấu hình không public cổng 3306 ra ngoài. Điều đó có nghĩa là không ai khác ngoài A mới có thể kết nối được vào máy chủ MySQL đó.

Tuy nhiên nếu sử dụng SSH Tunneling để đào “hầm” chuyển tiếp cổng 3306 của A về một cổng nào đó của máy B là hoàn toàn khả thi. Tức là chúng ta có thể gián tiếp kết nối vào A thông qua B.

Để làm được điều đó, tất nhiên chúng ta phải có phiên (session) SSH vào A mới có thể thiết lập được Tunneling.

  Tự tạo SSH tunnel để forward port ra remote server

  Kết nối SSH với máy chủ ảo EC2 Instance Linux trên Amazon AWS

Lợi ích của việc sử dụng Tunnel SSH

SSH Tunnel có những lợi ích nhất định cho những nhóm người dùng khác nhau.

Đối với người dùng cá nhân, SSH Tunneling có thể là một giải pháp kết nối với các ứng dụng trên máy chủ từ xa một cách nhanh chóng và dễ dàng nhất mà vẫn đảm bảo được tính an toàn trên các mạng không đáng tin cậy. Không cần phải mở cổng ra ngoài Internet, không cần phải thiết lập một mạng riêng ảo…

Đối với môi trường doanh nghiệp thì SSH Tunneling được sử dụng rộng rãi trong các hệ thống máy tính thông qua những phần mềm được tạo ra dựa trên nó. Nhưng chung quy lại mục đích của nó vẫn là kết nối những ứng dụng lại với nhau trong một hệ thống máy tính.

Xem thêm các việc làm Linux lương cao trên TopDev

Hạn chế

Tuy lợi ích mạng lại là rất lớn nhưng SSH Tunnel cũng đi kèm với những rủi ro.

Các kết nối SSH được mã hóa rất mạnh, điều này vô tình làm cho việc quan sát dữ liệu ở bên trong “đường hầm” hầu như trở nên vô hình với các công cụ giám sát mạng. Và nếu kẻ tấn công lợi dung điều này để ăn cắp dữ liệu thì rất nguy hiểm.

Sử dụng SSH tunneling có thể dễ dàng thiết lập một port-forwarding chuyển tiếp cổng bị chặn từ firewall về một máy khác. Hầu hết firewall cung cấp ít hoặc không có cơ chế ngăn chặn điều này.

Do thiết lập SSH tunnel đơn giản chỉ bằng một lệnh duy nhất nên nhiều phầm mềm độc hại lén cài mã vào để thực thi trên máy chủ với mục đích xấu.

Các cuộc tấn công bằng SSH Tunnel cũng nhằm mục đích ẩn danh. Những kẻ tấn công bằng cách nào đó vào được các máy chủ của nạn nhân sẽ mở một Tunneling và điều khiển chúng từ xa. Các máy chủ này sẽ được dùng vào mục đích tạo ra các cuộc tấn công trên quy mô lớn ví dụ như DDOS… Thực tế đã có ghi nhận vụ việc này khi hàng triệu thiết bị IoT bị tấn công và lợi dụng theo phương pháp này.

Khắc phục những hạn chế

Để ngăn chặn những rủi ro mà SSH Tunneling gây ra đòi hỏi người vận hành có khả năng giám sát, kiểm soát và kiểm tra các kết nối SSH được mã hóa. Cấu hình phù hợp và tăng cường bảo mật hệ điều hành của các thiết bị IoT.

Cách thiết lập Tunnel SSH

Chuyển tiếp cổng cục bộ (Local Forwarding)

Giả sử bạn muốn chuyển tiếp cổng 3306 của A có địa chỉ IP x.x.x.x về cổng 3307 của B có địa chỉ IP z.z.z.z:

$ ssh -L 3307:z.z.z.z:3306 [email protected] 

Với [email protected] là lệnh đăng nhập vào server thông qua SSH.
Lúc này mọi kết nối đến z.z.z.z:3307 sẽ tương đương x.x.x.x:3306.

Tương tự nếu muốn chuyển cổng 3306 của A về máy tính cá nhân:

$ ssh -L 3307:127.0.0.1:3306 [email protected] 

Mặc định các lệnh tạo Tunneling sẽ giữ lại phiên và bạn sẽ thấy terminal giữ một kết nối đến server. Để chạy Tunneling trong nền (background) thì thêm tùy chọn -N -f:

$ ssh -L 3307:z.z.z.z:3306 -N -f [email protected] 

Chuyển tiếp từ xa (Remote Forwarding)

Giả sử bạn muốn chuyển tiếp cổng 80 của A có địa chỉ IP x.x.x.x về cổng 8080 trên máy cá nhân:

$ ssh -R 80:localhost:8080 [email protected]

Với [email protected] là thông tin đăng nhập vào server thông qua SSH.

Mặc định server sẽ tắt Remote Forwarding, nếu muốn sử dụng tính năng này chúng ta cần phải chuyển cấu hình GatewayPorts no thành GatewayPorts yes trong cấu hình sshdconfig của ssh thông thường ở /etc/ssh/sshdconfig.

Hoặc thiết lập GatewayPorts clientspecified để chỉ định một địa chỉ IP mới có quyền forwarding.

$ ssh -R z.z.z.z:80:localhost:8080 [email protected]

Điều này chỉ cho phép IP z.z.z.z chuyển tiếp cổng 80 của A về cổng 8080 của local.

Tổng kết

SSH Tunneling hay chuyển tiếp cổng (port-forwarding) là một giải pháp chuyển tiếp cổng của một máy về một máy khác thông qua “đường hầm” được đào bởi SSH đảm bảo độ tin cậy cao.

SSH Tunneling mang lại nhiều lợi ích và cũng kèm theo những rủi ro. Để ngăn chặn điều đó đòi khỏi khả năng giám sát hệ thống của người vận hành.

Thiết lập SSH Tunneling rất đơn giản chỉ bằng một câu lệnh duy nhất.

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

[topdev-related-blogs ids=”50001,43849,54563″]

Đừng bỏ lỡ tin tuyển dụng IT mới nhất trên TopDev

Những cải tiến đáng giá của Python 3.12

Những cải tiến đáng giá của Python 3.12

Trong hầu hết các bảng xếp hạng ngôn ngữ lập trình, Python luôn có mặt trong top đầu, thậm chí là đứng đầu nhờ sự hiệu quả và tối ưu của nó. Với những phát triển nhanh của công nghệ hiện nay, nhất là trong các lĩnh vực xử lý dữ liệu lớn Big Data hay trí tuệ nhân tạo AI thì bản thân Python cũng luôn đối mặt với những thách thức cần thay đổi nhằm tăng tốc độ và hiệu quả. Mới đây ngày 24/5/2023 phiên bản Python 3.12.0b1 được phát hành với nhiều cải tiến đáng giá mang tính cách mạng trong việc tối ưu hóa của ngôn ngữ lập trình. Bài viết hôm nay chúng ta cùng nhau tìm hiểu những tính năng mới trong phiên bản Python 3.12 này nhé.

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

Python là một ngôn ngữ lập trình bậc cao được phát triển với mục đích lập trình đa năng cùng thiết kế dễ đọc, dễ học và dễ nhớ. Được xuất hiện lần đầu vào năm 1991, trải qua hơn 30 năm thì Python luôn được xếp hạng vào những ngôn ngữ lập trình phổ biến nhất.

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

Python là một ngôn ngữ lập trình đa mẫu hình, lập trình hướng đối tượng và lập trình cấu trúc được hỗ trợ hoàn toàn, và nhiều tính năng của nó cũng hỗ trợ lập trình hàm và lập trình hướng khía cạnh. Python hiện nay hỗ trợ hầu hết các nền tảng hệ điều hành phổ biến từ Windows, Mac OS hay Linux. Nhờ những tính chất trên cùng với sự hỗ trợ đóng góp đến từ cộng đồng với các thư viện đa dạng, Python được ứng dụng trong nhiều lĩnh vực, nhất là trong các ngành phát triển trí tuệ nhân tạo AI hay xử lý dữ liệu lớn Big Data.

  Python là gì? Tổng hợp kiến thức cho người mới bắt đầu

Python version 3.12

Python version 3.12

Python 3.0 được ra mắt ngày 3/12/2008; là một phiên bản lớn không tương thích ngược hoàn toàn với việc nhiều tính năng được chuyển mã ngược về loạt phiên bản Python 2.6.x và 2.7.x. Cũng vì thế mà hiện nay, Python vẫn duy trì hỗ trợ cả 2 phiên bản 3.x và 2.x; nhiều ứng dụng cũng tương thích với phiên bản Python 2.x.

Python 3.12 sẽ là phiên bản được dự kiến phát hành vào ngày 31/7/2023 sắp tới; và mới đây nhất ngày 22/5/2023 phiên bản beta thứ nhất với mã hiệu là 3.12.0b1 được giới thiệu với nhiều tính năng mang tính cách mạng trong việc tối ưu hóa ngôn ngữ, hứa hẹn triển khai nhanh hơn và hiệu quả hơn. Cùng điểm qua các tính năng mới đáng giá trên Python 3.12 này nhé:

Thông báo lỗi tốt hơn

Việc thông báo lỗi trên Python trong những phiên bản gần đây đã không chỉ dừng ở việc chỉ rõ chính xác vị trí lỗi (bao gồm dòng code, vị trí trên dòng) mà còn chi tiết hơn khi chỉ ra những đề xuất về những gì có thể sai trong đoạn code trên. Với phiên bản Python 3.12, thông báo lỗi còn có những cải tiến bổ sung như:

  • Đề xuất được module bị import thiếu, bao gồm các module từ thư viện chuẩn của Python
  • Đề xuất tốt hơn phương án xử lý khi code của bạn gặp lỗi cú pháp phổ biến khi nhập
  • Đề xuất NameError bao gồm cả thể hiện self của lớp
  Biến số và kiểu dữ liệu số trong Python

Hỗ trợ cho Linux perf profiler

Linux perf (tiện ích kiểm soát không gian người dùng) là một công cụ phân tích hiệu suất trong Linux. Với những phiên bản trước đây, Python cho phép perf hoạt động và trả về thông tin những gì đang xảy ra ở level C trong Python Runtime. Version Python 3.12 kích hoạt chế độ opt-in (chế độ chủ động nhận thông tin từ hệ thống) để cho phép perf thu thập thông tin chi tiết về các chương trình Python. Việc chọn tham gia hay không có thể được thực hiện trong khai báo môi trường (environment) hoặc trực tiếp trong chương trình với function sys.activate_stack_trampoline.

Tham khảo Job HOT Python Developer Ho Chi Minh hấp dẫn trên TopDev

Khả năng giám sát và gỡ lỗi nhanh hơn

Thông thường để giám sát hay gỡ lỗi trong chương trình Python thì bạn cần đính kèm trình gỡ lỗi (debugger), khiến cho hiệu suất chương trình của bạn bị ảnh hưởng, chạy chậm đi ở toàn chương trình một cách không cần thiết.

Tiêu chuẩn của phiên bản mới bổ sung các hooks để có thể đính kèm phần gỡ lỗi hay giám sát vào chương trình với điểm bắt đầu và kết thúc; giúp giảm bớt được chi phí khi thực hiện các công việc này và không làm ảnh hưởng nhiều đến hiệu suất chương trình.

  Python và cách tiết kiệm dung lượng cho phần mềm nhúng

Hỗ trợ phương thức đặc biệt với giao thức bộ đệm

Dunder method là các phương thức đặc biệt mà trong Python tự động gọi, được bắt đầu và kết thúc bằng dấu gạch dưới kép (__). Việc gọi các phương thức này không được thực hiện trực tiếp mà xảy ra trong nội bộ lớp trên một hành động nhất định. Python 3.12 triển khai các phương thức dunder mới cho các đối tượng cho phép mã Python hoạt động với giao thức bộ đệm, thay vì việc trước đây phải viết các đối tượng đó bằng C. Phương thức __buffer__ có thể được sử dụng cho mã cấp phát bộ nhớ mới hay truy cập bộ nhớ hiện có.

Cải tiến khả năng gợi ý code khi đánh máy

Từ phiên bản 3.5 thì Python đã cho phép các công cụ linting phát hiện trước được nhiều lỗi ngay lúc nhập để cảnh báo hay gợi ý code. Với phiên bản mới lần này bổ sung thêm các tính năng bao quát phạm vi sử dụng rộng hơn và chi tiết hơn.

Cải thiện hiệu suất

Python 3.12 mang lại một số cải thiện về mặt hiệu suất đáng chú ý như sau:

  • Comprehension inlining: Comprehension là một cú pháp cho phép bạn nhanh chóng tạo danh sách hay tập hợp; trong Python 3.12 nó có thể tạo một cách nội tuyến (inline) thay vì tạo các đối tượng tạm thời. Điều này giúp tăng tốc độ lên khoảng 11% so với trước.
  • Immortal objects: Các đối tượng bất tử trong Python là những đối tượng không bao giờ bị thay đổi số lượng tham chiếu. Về lâu dài, nó giúp việc triển khai thay đổi quy mô đa lõi dễ dàng hơn và triển khai các tối ưu hóa khác.
  • Smaller object sizes: Kích thước cơ sở của 1 đối tượng Python hiện tại là 208 bytes; kể từ phiên bản Python 3.12 sẽ được tái cấu trúc cho nhỏ hơn 1 nửa, chỉ còn 96 bytes
  • Subinterpreters: trình thông dịch phụ tạo khả năng có nhiều phiên bản trình thông dịch chạy song song trong một quy trình Python. Đây là một bước tiến lớn hướng tới tính song song (Parallelism) tốt hơn trong Python

Kết bài

Python là một ngôn ngữ lập trình năng động, luôn phải đối mặt với những thách thức trong việc tăng tốc độ và hiệu quả. Với những cải tiến trong phiên bản Python 3.12 sắp tới, tương lai của Python hứa hẹn sẽ triển khai nhanh hơn và hiệu quả hơn. Hy vọng bài viết này mang lại cho bạn những thông tin hữu ích 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

[topdev-related-blogs ids=”49508,50506,51217″]

Top IT Jobs hot dành riêng cho Top Developers tại TopDev!

Top 7 phương pháp tự học lập trình tốt nhất dành cho Developer

Top 7 phương pháp tự học tốt nhất dành cho lập trình viên

Tự học là một yếu tố quan trọng giúp các lập trình viên phát triển kỹ năng và nâng cao hiệu suất làm việc. Tuy nhiên, tự học như thế nào cho đúng, cách học nào là hiệu quả nhất đối với bạn? Trong bài viết này, chúng ta sẽ khám phá các phương pháp tự học lập trình tốt nhất dành cho người mới, giúp bạn tận dụng tối đa tiềm năng của mình và trở thành một lập trình viên tài giỏi.

Đọc sách dạy lập trình

Đọc sách là một phương pháp tự học quan trọng cho lập trình viên. Nó mang lại nhiều lợi ích, bao gồm tiếp cận kiến thức chuyên sâu về lập trình, mở rộng phạm vi kiến thức và cập nhật với công nghệ mới.

phương pháp tự học tốt nhất dành cho lập trình viên

Để tận dụng tối đa việc đọc sách, bạn có thể chọn những tựa sách phù hợp như “Clean Code” của Robert C. Martin để rèn kỹ năng viết mã sạch, “The Pragmatic Programmer” của Andrew Hunt và David Thomas để học cách suy nghĩ như một lập trình viên chuyên nghiệp, hoặc “Design Patterns: Elements of Reusable Object-Oriented Software” của Erich Gamma và đồng tác giả để hiểu về các mẫu thiết kế phần mềm.

Đọc sách là một công cụ mạnh mẽ để tiến bộ và phát triển trong lĩnh vực lập trình. Tham khảo bài viết này để lựa chọn các quyển sách phù hợp với bạn nhé: Sách hay nhất dành cho lập trình viên (2024).

Tham gia các khóa học, khóa đào tạo trực tuyến

Tham gia các khóa học và khóa đào tạo trực tuyến là một phương pháp tự học tốt nhất dành cho lập trình viên. Các khóa học này thường được thiết kế và giảng dạy bởi các chuyên gia trong lĩnh vực lập trình, đảm bảo rằng bạn nhận được kiến thức chất lượng và được hướng dẫn từ những người có kinh nghiệm.

Thêm nữa, khóa học trực tuyến mang lại linh hoạt về thời gian và không gian. Bạn có thể học theo lịch trình của mình và từ bất kỳ địa điểm nào có kết nối internet. Cuối cùng, có sự đa dạng về chủ đề và cấp độ của các khóa học trực tuyến. Bạn có thể chọn khóa học phù hợp với kiến thức và mục tiêu của mình, từ các khóa cơ bản đến nâng cao.

Tìm một người hướng dẫn

phương pháp tự học tốt nhất dành cho lập trình viên

Tìm một người hướng dẫn là một phương pháp tốt để tự học lập trình. Bạn có thể tìm người hướng dẫn mình bằng cách:

  • Tham gia cộng đồng lập trình: Tham gia các diễn đàn, nhóm trên mạng xã hội hoặc cộng đồng lập trình để tìm kiếm người hướng dẫn. Hỏi và chia sẻ với cộng đồng sẽ giúp bạn tìm được những người có kinh nghiệm và sẵn lòng giúp đỡ.
  • Tìm giảng viên trực tuyến: Có nhiều nền tảng trực tuyến như Codementor, MentorCruise, hay Wyzant cung cấp dịch vụ tìm người hướng dẫn. Bạn có thể tìm và thuê giảng viên với chuyên môn phù hợp với nhu cầu và mục tiêu học tập của bạn.
  • Networking: Tìm kiếm và tham gia các sự kiện, hội thảo, meetup về lập trình để mở rộng mạng lưới và kết nối với những người có kinh nghiệm trong lĩnh vực lập trình. Bạn có thể tìm được người hướng dẫn thông qua mối quan hệ và trao đổi kinh nghiệm.

Tham khảo code của lập trình viên khác

Tham khảo code của lập trình viên khác là một trong những phương pháp học hiệu quả và được rất nhiều lập trình viên sử dụng. Bạn có thể tìm thấy nhiều mã nguồn mở khác nhau trên web để nắm bắt thông tin chi tiết và nâng cao kiến ​​thức của mình. Một số nền tảng như GeeksforGeeks, GitHub và nhiều nguồn khác cung cấp một kho lưu trữ mã nguồn phong phú cho các ngôn ngữ lập trình khác nhau.

phương pháp tự học tốt nhất dành cho lập trình viên

Khi tham khảo code của người khác, đừng chỉ đọc mà hãy thực hiện việc kiểm tra và chạy thử code đó. Tự cấu trúc lại code và tìm ra các giải pháp sáng tạo để nâng cao khả năng giải quyết vấn đề của mình. Bạn cũng có thể tìm hiểu về phong cách viết code, các quy tắc đặt tên biến, cấu trúc dự án và các nguyên tắc lập trình từ các mã nguồn chất lượng.

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

Xây dựng các dự án cá nhân

Xây dựng dự án cá nhân giúp bạn áp dụng kiến thức, rèn kỹ năng thực tế và tìm hiểu quy trình phát triển phần mềm. Nó cũng cho phép bạn thử nghiệm, sáng tạo và khám phá các khía cạnh mới trong lập trình. Bạn có thể bắt đầu từ việc nắm vững cơ bản, sau đó dần dần tăng cường độ phức tạp và quy mô dự án.

Không cần phải xây dựng những dự án quá phức tạp cho dự án đầu tiên của bạn. Thay vào đó, bạn có thể bắt đầu với những dự án nhỏ như trình soạn thảo văn bản, máy tính hoặc trò chơi như rắn/cờ vua. Từ đó, bạn có thể tiến tới các dự án phức tạp hơn, nâng cao khả năng lập trình của mình.

Tham gia các cộng đồng trong lĩnh vực IT

Tham gia các cộng đồng trong lĩnh vực Công nghệ thông tin (IT) là một trong những phương pháp tự học tốt nhất dành cho lập trình viên. Thông qua việc tham gia các cộng đồng này, bạn có cơ hội gặp gỡ và làm việc với các lập trình viên khác trên toàn thế giới, những người có thể giúp bạn phát triển trong sự nghiệp và nâng cao kỹ năng lập trình của mình.

phương pháp tự học tốt nhất dành cho lập trình viên
StackOverflow

Tham gia các cộng đồng lập trình mang lại cho bạn nhiều lợi ích, bao gồm cập nhật những xu hướng mới nhất trong ngành, nhận được giải đáp cho các câu hỏi và thắc mắc về coding, chia sẻ ý tưởng dự án và học hỏi từ kinh nghiệm của người khác. Các cộng đồng trực tuyến như Developers Forum, GitHub, Viblo, StackOverflow, Tinh tế, v.v. là những nơi tốt để bạn tham gia và tìm kiếm sự hỗ trợ và trao đổi kiến thức với cộng đồng lập trình viên.

Chơi các game code

Chơi các game code là một cách thú vị và hiệu quả để rèn kỹ năng lập trình. Đây là một trong những phương pháp học tập tương tác và thực hành được nhiều lập trình viên sử dụng. Bằng cách tham gia vào các game code, bạn có thể rèn kỹ năng giải quyết vấn đề, tăng cường logics và khám phá những khía cạnh mới của lập trình.

phương pháp tự học tốt nhất dành cho lập trình viên

Có nhiều game code phổ biến và thú vị mà bạn có thể thử, bao gồm “CodeCombat”, “Codingame”, “HackerRank” và “Project Euler”. Các game này đưa bạn vào những tình huống thực tế, yêu cầu bạn tìm ra giải pháp thông qua việc viết code. Bạn có thể cạnh tranh với các lập trình viên khác, giải các câu đố lập trình và nâng cao kỹ năng của mình.

Tổng kết

Tự học lập trình là một hành trình không chỉ đòi hỏi kiên nhẫn và nỗ lực, mà còn yêu cầu sự linh hoạt trong việc áp dụng các phương pháp học hiệu quả. Bài viết trên đã tổng hợp một số phương pháp tự học tốt nhất dành cho lập trình viên mà bạn có thể áp dụng.

Tuy nhiên, không có một phương pháp tự học duy nhất phù hợp với tất cả mọi người. Quan trọng là bạn phải tìm ra phương pháp hoặc kết hợp các phương pháp phù hợp với bản thân để tiến bộ và phát triển trong lĩnh vực lập trình. Hãy kiên nhẫn, kiên trì và luôn tìm cách học hỏi, nâng cao kỹ năng của mình. Với sự đam mê và nỗ lực, bạn có thể trở thành một lập trình viên giỏi và thành công trong sự nghiệp của mình.

Tổng hợp bởi TopDev

[topdev-related-blogs ids=”54002,29737,12645″]

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

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

[topdev-related-blogs ids=”52754,50813,48721″]

Ứ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

[topdev-related-blogs ids=”54145,52431,52310″]

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

[topdev-related-blogs ids=”39839,29319,36522″]

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

[topdev-related-blogs ids=”40068,11034,54563″]

Đừ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é!

 

[topdev-job ids=”2030077,2030051,2030222″]
[topdev-related-blogs ids=”53667″]

 

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é!

 

[topdev-job ids=”2030056,2030004,2030002″]
[topdev-related-blogs ids=”53407,53483″]

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