Home Blog Page 126

Tail Call Optimization là gì? Và tại sao bạn không cần quan tâm đến nó?

Tail Call Optimization là gì? Và tại sao bạn không cần quan tâm đến nó?

Bài viết được sự cho phép của tác giả Huy Trần

Chỉ nếu như bạn sử dụng JavaScript

Tail call là từ được cấu thành từ hai chữ, chữ tail và chữ call.

tail /teɪl/
call /kɔːl/ (in UK) or /kɑl/ (in US)

Chữ tail Hài hước tí, nếu các bạn không thấy zui thì nên tự xem lại óc hài hước của mình. À không, ý mình là của các bạn. có nghĩa là đuôi, còn chữ call có nghĩa là gọi, hợp lại ta có chữ gọi đuôi, hay gọi đằng đuôi. Trong môn khoa học máy tính, gọi đằng đuôi có nghĩa là lời gọi tới một hàm con tại vị trí cuối cùng trong một hàm cha nào đó, đằng sau lời gọi này, hàm cha không còn làm bất cứ một việc gì khác nữa.

  Front end Optimization – 9 tips để cải thiện Web Performance
  View Hierarchy, Optimize Layout và Custom View (Phần 1)!

Kiểu như này:

function sum(a, b) {
    return a + b;
}

// Ví dụ 1
function add(a, b) {
    return sum(10, 20); // đây là tail call
}

// Ví dụ 2
function add(a, b) {
    return 10 + sum(10, 20); // đây không phải là tail call
}

// Ví dụ 3
function add(a, b) {
    let result = sum(10, 20); // đây không phải là tail call
    return result;
}

Như trên ta thấy, chỉ có lời gọi hàm sum() ở ví dụ 1 là tail call, còn hai ví dụ còn lại thì không.


Trước khi nói tiếp về tail call optimization, chúng ta hãy nói qua một chút về call stack.

Call stack là một cấu trúc dữ liệu kiểu ngăn xếp (stack) được sử dụng để lưu vị trí hoạt động của một chương trình, khi có một lời gọi hàm (call) xảy ra, thì stack sẽ được đẩy thêm vào (push) một phần tử, sau khi hàm đó xử lý xong thì nó sẽ bị gỡ ra (pop). Việc này giúp cho máy tính biết được nó đang đứng ở đâu trước khi một lời gọi hàm xảy ra, và có thể quay về sau khi hàm đó kết thúc.

Ở ví dụ 3, đầu tiên, khi chương trình thực hiện, thì call stack của chúng ta sẽ biến đổi như sau:

Đầu tiên, hàm add(a, b) sẽ được push vào call stack, vì đây là hàm vừa được gọi:

Khi đi vào hàm này, chúng ta bắt gặp lời gọi đến hàm sum(), lúc này trong call stack sẽ được push vào một frame mới cho hàm sum, việc call stack được push thêm frame mới gọi là call stack growth:

Đi vào hàm sum, giá trị của biểu thức 10 + 20 sẽ được tính và trả về:

Sau khi hàm sum() trả về kết quả, nó sẽ bị pop khỏi call stack, chương trình lúc này tiếp tục sau khi đã tính toán được giá trị của biến result:

Sau khi lệnh return result được hoàn thành, thì hàm add cũng đã được thực hiện xong, nó cũng sẽ được pop ra khỏi call stack, và call stack lúc này không còn gì nữa:


Tail Call Optimization là một kĩ thuật tối ưu mà compiler sẽ làm cho Compiler làm điều này như thế nào thì các bạn có thể xem thêm ở cuối bài.việc thực thi code không xảy ra call stack growth.

Cụ thể, với tail call optimization, thì call stack của chúng ta sẽ biến đổi như sau khi thực thi code ở ví dụ 1:

Đầu tiên chúng ta cũng bắt đầu với hàm add() nằm trong call stack:

Và khi gặp lời gọi hàm sum() thì chuyện gì sẽ xảy ra? Lưu ý lúc này, hàm sum() được gọi khi chúng ta return về giá trị của nó, có nghĩa là hàm add() đã xong nhiệm vụ:

Chính vì thế, add() sẽ bị loại khỏi call stack, và sum() sẽ được đưa vào thay thế. Lưu ý là, stack frame trước đó dành cho add() có thể sẽ được sử dụng lại cho sum() luôn. Nói chung là không xảy ra call stack growth.

Tiếp tục thực thi, chúng ta tính toán biểu thức 10 + 20:

Rồi return luôn, hàm sum() lúc này sẽ bị pop khỏi call stack, và chương trình kết thúc tại đây:

Việc thực thi mà không làm call stack phình ra, chúng ta gọi đó là zero stack growth.


Vậy compiler đã làm gì để khi thực thi chúng ta có zero stack growth? Chúng ta đều biết, compiler sẽ biên dịch chương trình về mã máy, có thể biểu diễn bằng code Assembly, điều này đúng với cả JavaScript mặc dù để giải thích thì dài dòng lắm, nên mình sẽ để dành cho một bài viết sau.

Các bạn đừng lo khi thấy phần này bắt đầu nói về Assembly, mình cũng đâu có biết Assembly đâu . Chúng ta chỉ cần biết rằng, khi máy tính thực thi code Assembly, nó sẽ có một con trỏ, gọi là program counter, chạy từ đầu tới cuối của chương trình đó, đụng lệnh nào thì thực thi lệnh đó (giống khi ta đọc sách mà lấy tay chỉ vào từng dòng để đánh vần vậy).

Và để tìm hiểu về kĩ thuật tail call optimization của compiler, chúng ta chỉ cần biết 2 lệnh, đó là:

  • call: lệnh điều khiển cho program counter tạm thời nhảy đến một vị trí nào đó trong chương trình để xử lý, sau khi xử lý xong thì nó sẽ quay về, và tiếp tục xử lý lệnh kế tiếp, nghe như ném boomerang nhỉ. Ví dụ đoạn code sau có lệnh call, sẽ được thực thi theo thứ tự từ trên xuống, và nhảy tứa lưa như mấy mũi tên trong hình:
  • jmp: là jump, lệnh điều khiển program counter nhảy từ vị trí hiện tại sang một vị trí được chỉ định, nhảy xong thì đi luôn chứ không quay về nữa.

Như vậy, theo như hiểu biết về call stack ở phần trước, ta cũng có thể hình dung ra rằng, khi call được gọi thì sẽ có call stack growth xảy ra.

Và khi thực hiện tail call optimization, compiler sẽ sinh code đại loại như sau trong trường hợp ví dụ 3, không có tail call:

fn_add:       # hàm add
call fn_sum   # call hàm sum
ret           # rồi quay lại return kết quả

Và trong trường hợp có tail call của ví dụ 1 thì sẽ như sau:

fn_add:      # hàm add
jmp fn_sum   # jump tới sum luôn

Quá dễ hiểu, đúng không? 


OK, vậy tại sao đầu bài lại nói là không cần quan tâm đến tail call optimization khi dùng JavaScript?

Đơn giản, là vì JavaScript không có tail call optimization!

Mặc dù trong đặc tả ES6 có mô tả về nó, hầu như không có một JavaScript engine nào implement nó cả, trừ Safari .

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

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

Xem thêm IT Jobs for Developer hấp dẫn trên TopDev

Những tựa sách nổi tiếng dành cho Software Developer – Phần 2

sách cho Software Developer
Những tựa sách cho Software Developer - Phần 2

Tác giả: Andrew

Giới thiệu

Sách là một nguồn tài nguyên vô tận để các dev dùng làm tài liệu tham khảo trong công việc. Nguồn sách nước ngoài luôn có giá trị bao phủ đối với các vấn đề thường gặp khi làm việc, nhất là với các Software Developer. Bài viết dưới đây sẽ tiếp tục chuỗi giới thiệu những tựa sách nổi tiếng dành cho Software Developer mà các dev có thể tham khảo.

software developer
Có nhiều tựa sách nổi tiếng cho Software Developer

Những cuốn sách được các Software Developer lựa chọn nhiều nhất

8. Programming Pearls – Jon Bentley

Programming Pearls là cuốn sách có nội dung không hoàn toàn là những vấn đề kỹ thuật lập trình khô khan mà nó mà nó đi sâu vào sự hiểu biết và sáng tạo trong khi làm kỹ thuật. Người lập trình viên và sản phẩm của họ được ví như “pearl” – ngọc trai. Giống như ngọc trai tự nhiên được hình thành từ những hạt cát bên trong vỏ hàu, những viên ngọc trai khi lập trình này phát triển từ những vấn đề thực tế khiến các lập trình viên thực sự cảm thấy khó khăn và cần phải học hỏi. Các kiến thức này rất thú vị và chúng dạy các kỹ thuật lập trình quan trọng và các nguyên tắc thiết kế cơ bản.

Xem thêm các việc làm KMS tuyển dụng

9. Peopleware: Productive Projects and Teams – Tom DeMarco and Timothy Lister

Peopleware là một cuốn sách phổ biến về quản lý tổ chức phần mềm. Ngay trong phần đầu tiên của cuốn sách đã cho thấy “Các vấn đề chính về công nghệ sẽ không được chúng tôi đề cập quá nhiều”. Các tác giả của cuốn sách đã trình bày hầu hết các chủ đề dưới dạng các nguyên tắc được hỗ trợ bởi một số câu chuyện cụ thể hoặc thông tin khác liên quan đến vấn đề lập trình dự án và làm việc theo nhóm.

  Biến Git và GitHub trở thành công cụ đắc lực cho Software Engineer
  Hướng dẫn viết CV bất khả chiến bại dành cho Software Engineer

10. Soft Skills: The Software Developer’s Life Manual – John Sonmez

Cuốn sách cho Software Developer này là một chuỗi các hướng dẫn để người đọc có một cuộc sống toàn diện và hài lòng với tư cách là một chuyên viên trong lĩnh vực công nghệ. Trong đó, John Sonmez – một lập trình viên cao cấp đã đưa ra lời khuyên cho các dev về các chủ đề “mềm” quan trọng như sự nghiệp và năng suất, tài chính cá nhân và đầu tư, thậm chí cả thể lực và các mối quan hệ.

Xem thêm các việc làm tuyển dụng Tester chưa có kinh nghiệp tại TopDev

11. The Clean Coder: A Code of Conduct for Professional Programmers – Robert C. “Uncle Bob” Martin

Để trở thành một lập trình viên chuyên nghiệp, việc thực hành build chương trình chắc chắn là phần không thể thiếu trong việc làm quen và giải quyết vấn đề. Trong cuốn sách này, chuyên gia phần mềm nổi tiếng Robert C. Martin giới thiệu tới người đọc các nguyên tắc, kỹ thuật, công cụ và thực hành làm việc của công việc liên quan đến phần mềm.

Xem thêm 32 cuốn sách học lập trình bạn nhất định phải đọc

Cuốn sách này chứa đựng những lời khuyên thực tế – về mọi thứ từ ước tính và viết mã đến cấu trúc lại và kiểm thử. Nó bao hàm nhiều thứ hơn là kỹ thuật: Đó là về thái độ. Martin chỉ ra cách tiếp cận phát triển phần mềm với tính danh dự, lòng tự tôn và tự hào; làm việc tốt và làm việc sạch sẽ; giao tiếp và ước tính trung thực; đối mặt với những quyết định khó khăn với sự rõ ràng và trung thực; và hiểu rằng kiến ​​thức sâu rộng đi kèm với trách nhiệm hành động.

12. Don’t Make Me Think: A Common Sense Approach to Web Usability – Steve Krug

Don’t Make Me Think là một cuốn sách của Steve Krug nói về sự tương tác giữa con người với máy tính và khả năng sử dụng web. Tiền đề của cuốn sách là một chương trình phần mềm hoặc một trang web tốt phải cho phép người dùng hoàn thành nhiệm vụ dự định của họ một cách dễ dàng và trực tiếp nhất có thể. Krug chỉ ra rằng những người giỏi thỏa mãn hoặc sử dụng giải pháp có sẵn đầu ti

sách công nghệ
Tìm hiểu nhiều đầu sách khác nhau giúp bạn có thêm kiến thức lập trình phần mềm

13. Cracking the Coding Interview: 189 Programming Questions and Solutions – Gayle Laakmann McDowell

Đầu sách này chứa đựng gần 189 câu hỏi phỏng vấn lập trình, từ những điều cơ bản đến những vấn đề thuật toán phức tạp nhất để bạn tham khảo. Hướng dẫn các dev cách tìm ra từng giải pháp để bạn có thể tự học cách đạt được điều đó. Gợi ý về cách giải quyết từng câu hỏi trong số 189 câu hỏi, giống như những gì bạn sẽ nhận được trong một cuộc phỏng vấn thực sự.

Tham khảo tuyển dụng software engineer lương cao trên TopDev

Ngoài ra, trong cuốn sách này cũng bao gồm 5 chiến lược đã được chứng minh để giải quyết các câu hỏi thuật toán, để bạn có thể giải quyết các câu hỏi mà bạn chưa thấy. Nó bao quát rộng rãi các chủ đề thiết yếu, chẳng hạn như thời gian O lớn, cấu trúc dữ liệu và thuật toán cốt lõi. Và cung cấp một cái nhìn hậu trường về cách các công ty hàng đầu như Google và Facebook thuê các nhà phát triển.

  5 cuốn sách hay dẫn lối tư duy phản biện

14. Head First Design Patterns: A Brain-Friendly Guide – Eric Freeman, Elizabeth Robson, Kathy Sierra, and Bert Bales

Bất cứ lúc nào các dev cũng có thể sẽ phải vật lộn với các vấn đề liên quan đến thiết kế phần mềm. Và, rất có thể, người khác đã giải quyết vấn đề của bạn một cách gọn gàng trước đó rồi. Ấn bản này của Head First Design Patterns sẽ được cập nhật cho Java 8, cung cấp cho bạn các mô hình đã được thử nghiệm và được các nhà phát triển sử dụng để tạo phần mềm chức năng, có thể tái sử dụng và linh hoạt. Khi đọc xong cuốn sách này, bạn sẽ có thể tận dụng các kinh nghiệm và kiến thực có trong thực tiễn thiết kế tốt nhất của mình và áp dụng thành công trong công việc của mình.

Xem thêm các việc làm hấp dẫn KMS Technology tuyển dụng 2020

Kết luận

Sách không thể cung cấp hoàn toàn đầy đủ về những kiến thức cần có trong lập trình phần mềm. Tuy nhiên nếu chịu khó tìm kiếm chắc chắn bạn sẽ tìm được nhiều thông tin quan trọng, hiếm có ở những nguồn thông tin khác. Chờ đón phần tiếp theo để tìm thêm cho mình những cuốn sách hấp dẫn nhất cho Software Developer nhé.

Happy Coding!

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

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

Xem thêm việc làm tuyển dụng IT hấp dẫn tại TopDev

[XP] Mã kiểm thử đơn vị đầu tiên

[XP] Mã kiểm thử đơn vị đầu tiên
Bài viết được sự cho phép của BBT Tạp chí Lập trình
Sở hữu tập thể mã nguồn

Khi tạo kiểm thử ngay đầu tiên, trước khi viết mã, bạn sẽ thấy việc viết mã dễ dàng và nhanh hơn. Tổng thời gian để viết kiểm thử, và mã để vượt qua kiểm thử xấp xỉ thời gian lập trình một cách trực tiếp. Nhưng nếu đã có kiểm thử đơn vị, bạn không cần phải tạo ra chúng sau khi viết mã, điều đó giúp tiết kiệm được nhiều thời gian hơn cho hiện thời và rất nhiều về sau.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  Các trường hợp kiểm thử OTP

Việc tạo kiểm thử đơn vị giúp nhà phát triển thực sự quan tâm tới những gì cần hoàn thành. Các yêu cầu bài toán được làm rõ thông qua kiểm thử. Không có sự hiểu sai một đặc tả bài toán ở mã thực thi.

Ngoài ra, các kiểm thử đơn vị sẽ gửi những phản hồi tức thì khi bạn làm việc. Những phản hồi thường không rõ ràng một khi nhà phát triển đã hoàn thành các chức năng cần thiết. Sự tăng đột biến về phạm vi như sự mở rộng hay điều kiện lỗi cần phải được xem xét. Nếu chúng ta tạo ra các kiểm thử đơn vị đầu tiên, thì khi tất cả các kiểm thử đơn vị chạy không có nghĩa là chúng ta đã hoàn thành.

Ngoài ra, kiểm thử đơn vị còn có lợi cho thiết kế hệ thống. Việc kiểm thử đơn vị các hệ thống phần mềm gặp khó khăn xảy ra rất thường xuyên. Những hệ thống này thường có mã xây dựng trước và mã kiểm thử triển khai sau – thường do một nhóm khác phát triển. Bằng cách tạo ra các kiểm thử đầu tiên, mong muốn kiểm tra mọi thứ có giá trị với khách hành sẽ ảnh hưởng tới thiết kế. Do đó thiết kế của bạn sẽ dễ kiểm thử.

Có nhịp để phát triển phần mềm với kiểm thử đơn vị trước. Bạn tạo ra một kiểm thử để xác định một khía cạnh nhỏ của vấn đề. Sau đó, bạn viết mã đơn giản nhất để vượt qua kiểm thử. Sau đó, bạn viết kiểm thử thứ hai. Và bây giờ, bạn thêm vào mã để hoàn thiện kiểm thử mà bạn vừa tạo ra. Bạn tiếp tục cho tới khi không còn vấn đề nào cần giải quyết nữa. Một ví dụ viết bằng Java: Các vấn đề của máy pha cà phê.

Mã mà bạn viết ra thật đơn giản và ngắn gọn, chỉ thực hiện các chức năng bạn muốn. Nhà phát triển khác có thể xem cách sử dụng mã mới thông qua các kiểm thử. Khi giá trị đầu vào cho kết quả không xác định sẽ bị loại bỏ trong bộ kiểm thử.

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

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

Xem thêm IT Jobs hấp dẫn trên TopDev

Cài đặt MySQL Community Server trên macOS

Cài đặt MySQL Community Server trên macOS

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Trong bài viết này, mình sẽ hướng dẫn các bạn cách cài đặt MySQL Community Server trên macOS các bạn nhé!

Đầu tiên, các bạn cần phải đi đến địa chỉ https://dev.mysql.com/downloads/mysql/ để download tập tin cài đặt của MySQL dành cho macOS:

Cài đặt MySQL Community Server trên macOS

Có nhiều lựa chọn khác nhau, nhưng các bạn nên chọn tập tin .dmg để cài đặt vì nó có giao diện, sẽ dễ dàng hơn.

Sau khi download xong, hãy nhấp vào tập tin download để bắt đầu cài đặt MySQL các bạn nhé!

Ứng tuyển các vị trí tuyển dụng unity developer HCM lương cao trên TopDev

Cài đặt MySQL Community Server trên macOS

Click vào icon trong cửa sổ trên để tiếp tục nha các bạn.

Cài đặt MySQL Community Server trên macOS

Nhấp vào Continue nha các bạn.

Cài đặt MySQL Community Server trên macOS

Continue tiếp.

Cài đặt MySQL Community Server trên macOS

Continue tiếp.

Cài đặt MySQL Community Server trên macOS

Agree nha các bạn.

Cài đặt MySQL Community Server trên macOS

Đến đây thì các bạn có thể nhấn nút Install để bắt đầu cài đặt MySQL vào máy tính của mình rồi.

Cài đặt MySQL Community Server trên macOS

Nhập mật khẩu để cài đặt software mới trong macOS.

Cài đặt MySQL Community Server trên macOS

  Cấu hình đồng bộ hai database mysql server MySQL Replication
  Kinh nghiệm vận hành MySQL - Chú ý khi chọn MySQL làm database

Trong quá trình cài đặt, các bạn cần cấu hình mật khẩu của user root đăng nhập vào MySQL. Hãy chọn cách mà các bạn thiết lập mật khẩu trong hình trên các bạn nhé. Chúng ta nên chọn “Use Strong Password Encryption” rồi nhấn Next.

Cài đặt MySQL Community Server trên macOS

Với cách chọn này, các bạn bắt buộc phải đặt mật khẩu với ít nhất 8 ký tự, bao gồm cả chữ, số, và một số ký tự đặc biệt.

Sau khi đã đặt mật khẩu xong thì nhấn nút Finish các bạn nhé!

Ứng tuyển ngay các việc làm Unity mới nhất trên TopDev

Cài đặt MySQL Community Server trên macOS

Cần phải nhập password của user macOS để hoàn thành việc cài đặt mật khẩu cho user root này.

Cài đặt MySQL Community Server trên macOS

Nhấn nút Close để kết thúc các bạn nhé!

Các bạn có thể vào System Preferences

Cài đặt MySQL Community Server trên macOS

để quản lý việc start, stop MySQL các bạn nhé!

Cài đặt MySQL Community Server trên macOS

Bài viết gốc được đăng tải tại huongdanjava.com
Có thể bạn quan tâm:

System Design Cơ Bản: Long-Polling vs Websockets vs Server-sent Events

long polling

Bài viết được sự cho phép của tác giả Edward Thiên Hoàng

Long-polling, WebSockets hay Server-Sent là những cách giao tiếp phổ biến giữa Client và Server ví dụ những giữa Web-Browser và Web-Server. Đầu tiên ta hãy đi tìm hiểu về HTTP và các bước của nó trên môi trường Web như thế nào.

  1. Client sẽ mở ra một kết nối (connection) à yêu cầu (request) dữ liệu từ Server
  2. Server sẽ nhận yêu cầu và tính toán kết quả trả về
  3. Server sẽ trả về (response) kết quả cho Client vừa mở connection đó

11-1

Xem thêm: Thông tin tuyển dụng designer hấp dẫn trên TopDev

AJAX POLLING:

Polling là một kỹ thuật được sử dụng trong các ứng dụng AJAX, ý tưởng của nó là client sẽ liên tục gọi tới server để yêu cầu dữ liệu mới (polls/requests data). Client sẽ tạo ra một request và đợi kết quả trả về từ Server, nếu Server không tìm thấy hoặc trả kết quả về hoặc kết quả là rỗng (empty), thì một empty response sẽ được gửi về.

  1. Client sẽ mở một connection và request dữ liệu từ Server thông qua cổng kết nối HTTP.
  2. Những request trên sẽ được gửi đến Server theo định kỳ (intervals), ví dụ mỗi 1 giây sẽ có một request gửi đi.
  3. Server sẽ tính toán và trả về dữ liệu cũng thông qua kết nối HTTP.
  4. Client sẽ lặp lại cả 3 bước trên để liên tục cập nhật được dữ liệu mới nhất từ Server.

11-2

Vấn đề của Ajax Polling là Client phải liên tục gửi request tới Server, do đó sẽ tạo ra rất nhiều request với không có response nào trả về, gây lãng phí HTTP traffic của hệ thống.

HTTP LONG-POLLING

Đây là một biến thể của HTTP Polling truyền thống bằng cách cho phép Server chủ động đẩy (push) thông tin tới Client khi có dữ liệu mới, bằng cách Client sẽ gửi request tới Server mà không cần Server phải trả dữ liệu về ngay lập tức mà sẽ làm theo logic như bên dưới:

  • Nếu Server không có dữ liệu mới, thay vì không trả về hay trả về dữ liệu rỗng, vì Server sẽ giữ request đó và đợi cho tới khi có dữ liệu mới về.
  • Khi dữ liệu đã sẵn sàng thì Server sẽ gửi trả (response) về cho Client. Ngay lúc đó Client lại tiếp tục gửi một request tới Server, vì thế ở phía Server sẽ luôn luôn có một request mà nó có thể sử dụng để luôn cập nhật dữ liệu về phía Client.

Và một vòng đời của một HTTP Long-Polling sẽ như sau:

  1. Client tạo một HTTP request về phía Server và chờ đợi tới khi có response trả về.
  2. Server sẽ chờ cho tới khi có dữ liệu trả về hoặc quá thời gian time-out.
  3. Khi có dữ liệu Server sẽ trả về cho Client (HTTP respone)
  4. Client sau khi nhận được dữ liệu trả về hoặc quá time-out sẽ gửi tiếp một HTTP Long-Polling đến Server. Lúc này sẽ có một khoảng thời gian trễ giữa lúc client nhận và gửi request mới, nhưng thời gian trễ này tạm chấp nhậnd được.
  5. Mỗi HTTP Long-Polling sẽ có một khoảng time-out, nếu quá thời time-out connection sẽ đóng lại và mở lại một connection mới.

11-3

WEB-SOCKET

Websocket là giao thức chuẩn cho trao đổi dữ liệu hai chiều giữa client và server hay còn gọi là kênh Full Duplex. Giao thức WebSocket không chạy trên HTTP, thay vào đó nó thực hiện trên giao thức TCP.

Nó cung cấp một phương thức liên tục giữa Client và Server mà cả hai bên có thể gửi dữ liệu cho nhau bất kỳ lúc nào. Client kết nối với Server thông qua Websocket bằng một cú bắt tay (WebSocket handshake), nếu nó thành công thì dữ liệu có thể được trao đổi từ hai hướng bất kỳ lúc nào.

Người ta thường dùng Websocket thay vì HTTP cho những trường hợp yêu cầu real time (thời gian thực) bởi vì gói tin của WebSockets nhẹ hơn HTTP rất nhiều, giảm độ trễ của network và không cần phải gửi request liên tiếp như HTTP.

Điều này được hiện thực bằng cung cấp môt chuẩn hóa truyền tin giữa Server và client thông qua cổng  hoặc  có thêm bảo mật. Và dữ liệu truyền đi chấp nhận kiểu String và Binary Type ( large objects (blobs), ArrayBuffers)

  System Admin là gì? Mô tả công việc vị trí System Administrator
  Giải mã bí ẩn "system load" trên Linux

SERVER-SENT EVENTS (SSES)

SSEs cũng gần giống với Long-Polling nhưng khác là connection sẽ được lưu trữ (persistent) sử dụng cho một thời gian dài (long-terms) mà không có time-out và chỉ có Server sẽ sử dụng connection này để gửi dữ liệu về cho Client, và client chỉ có request (GET) dữ liệu mà không được phép gửi dữ liệu (POST) lên Server.

Vòng đời của của SSEs

  • Client yêu cầu lữ liệu từ Server sử dụg kết nối HTTP thông thường.
  • Connection giữa client và server sẽ được mở và duy trì.
  • Bất kỳ khi nào máy chủ sẽ gửi dữ liệu tới Client bất cứ khi nào có thông tin mới.

SSEs cũng giống WebSocket là thích hợp với các ứng dụng thời gian thực (real time) nhưng khác là SSEs chỉ là một chiều (Half duplex) giữa Server tới Client.

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

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

10 tips để trở thành Java Developer xịn hơn

java developer

Nhân dịp có nhiều bạn gửi tin nhắn làm thế nào để trở thành Java Developer xịn hơn, nên học Java như thế nào, và dùng trong lĩnh vực nào, mình sẽ chia sẻ vài điểm sẽ giúp bạn thăng tiến trở thành Java programmer và application developer xịn hơn.

Truớc khi đi vào chi tiết thì mình sẽ đặt trong hoàn cảnh là các bạn đều giải quyết khá tốt những mảng như Coding, Cấu trúc dữ liệu và Thuật toán, những concepts Khoa học máy tính như networking, protocols, lập trình hướng đối tượng,…

Tuyển dụng lập trình viên Java lương cao cho bạn

Học các tool DevOps (Docker và Kubernetes)

Kiến thức về DevOps đóng vai trò rất quan trọng với các Java developer hiện nay. Tối thiểu một developer cần biết và nắm rõ continuous integration và continuous deployment (CI/CD – tích hợp và triển khai liên tục) và vai trò của Jenkins. Ngoài ra senior Java developer còn phải build DevOps như set code best practice và tạo environment, build scripts và guideline.

Mình thì gợi ý bạn dành thời gian tìm hiểu DevOps cơ bản và các tool như Docker, Chef, Kubernetes song song đó là Mavin và Jenkins. Trên Udemy cũng có khóa học, nếu bạn cần nguồn tư liệu bài bản hơn.

10 Tips to Become a Better Java Developer in 2020

Học Java tốt hơn (những tính năng JDK 8 đến JDK 13)

Java luôn liên tục update, và ra phiên bản mới mỗi sáu tháng nên việc cập nhật kiến thức cho bản thân là rất quan trọng và khá thử thách. Nhiều lập trình viên Java với 7 đến 10 năm kinh nghiệm chưa từng viết nổi 1 dòng code có tính năng Java 8 (như lambdas hay Stream API). Mình hiểu rằng việc tiếp nhận kiến thức ở vài thời điểm trong sự nghiệp sẽ trở nên rất chậm nhưng nếu bạn không update, thì bạn sẽ bị bỏ lại phía sau.

Hầu hết các job lập trình Java yêu cầu biết Java 8, và nếu như bạn không đạt được, thì bạn sẽ không được đánh giá cao trong các buổi phỏng vấn Java. Giờ nếu bạn phân vân chưa biết bắt đầu từ đâu thì bạn có thể tham khảo The Complete Java MasterClass trên Udemy.

  4 tips học Java cơ bản nhanh nhất dành cho Beginner Developer

  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Học Spring Framework (Spring Boot)

Học Spring framework dường như đã là điều bắt buộc hiện nay đối với Java developer vì hầu hết các công ty đều phát triển dựa trên Spring frameworks như Spring MVC, Spring Boot và Spring Clouder để phát triển web app, REST APIs Microservices. Ngoài ra nó còn cung cấp các best practices như là dependency injection, giúp app dễ test hơn – một trong những thứ rất quan trọng trong các ứng dụng hiện đại.

Nếu bạn là newbie Java developer, mình khuyên bạn bắt đầu với Spring tutorial để biết những điều cơ bản nhất trong framework này, sau đó hãy đến Spring Boot và Spring Cloud để phát triển các app cao cấp hơn.

Học Unit Testing (Junit và Mockito)

Sự khác biệt giữa Java Developer giỏi và một Java Developer thường đó là khả năng kiểm thử trên từng đơn vị – unit testing.

Testing đã có bước phát triển dài và hiện nay đã có vài tool có sẵn dành cho unit testing, integration testing và automation testing. Bạn có thể nâng cao testing skill với thư viện JUnit với phiên bản gần đây nhất là JUnit 5 rất là mạnh và linh hoạt

Học APIs và Libraries (Jackson, Log4j)

Một đặc điểm thường thấy ở senior Java dev là họ có kiến thức tổng quát về hệ sinh thái Java, trong đó API là phần quan trọng. Java là một trong những ngôn ngữ lập trình lâu đời và phổ biến nhất thế giới, có rất nhiều thư viên và API có sẵn để build tất cả mọi thứ. Tất nhiên là bạn không cần phải biết hết tất cả các thư viện và APIs này, nhưng bạn phải làm quen với JSON processing APIs như Jackson và GSON, XML processing APIs như JAXB và Xerces, thư viện Unit testing như Mockito and JUnit, …

Tìm Java job lương cao trên TopDev ngay!

Học JVM Internals

Xem thêm JVM là gì

Nếu nghiêm túc với sự nghiệp Java developer, bạn nên tìm hiểu về cấu trúc bên trong jvm, những thành phần trong JVM hoạt động như thế nào như JIT, JVM option, Garbage collections và collectors, JIT, JVM option, Garbage collections và collectors, v.v. Khi đã hiểu rõ JVM bạn có thể viết Java app mạnh và có hiệu suất cao hơn.

Ngoài ra bạn cũng nên biết audit lại Java app cũng như là objects nào đang chiếm nhiều tài nguyên nhất, đâu là nút thắt cổ chai trong performace, như objects nào đang chiếm nhiều memory nhất hay đang ăn CPU nhất.

Học Design Patterns (GOF Patterns)

Nếu bạn đang bắt đầu viết Java app thì hầu như bạn phải code theo hướng đối tượng, thực hành với design pattern và thử nghiệm những giải pháp cho những vấn đề phổ biến. Vì vậy càng biết và kết hợp design pattern vào code thì app sẽ càng linh hoạt và dễ thay đổi hơn trong tương lai, ngoài ra chất lượng code tổng thể cũng như tư liệu hóa cũng được cải thiện nhiều, nếu như các Java dev khác cũng quen thuộc với design pattern thì họ sẽ hiểu solution rất nhanh.

Tuy nhiên cũng đừng tập trung vào phần code, hãy nắm tinh thần chung và sáng tạo hơn nữa, sử dụng các tính năng Java 8 như lambdas và Streams để viết lại các pattern như Srategy pattern.

6. Learn Design Patterns to become better Java developer

Tham khảo Global CyberSoft tuyển dụng Fresher đãi ngộ tốt tại TopDev

Học Kotlin (Android)

Nhiều năm trước khi đọc qua cuốn The Well-Grounded Java Developer, mình đã được truyền cảm hứng học Scala, sau đó mình cũng thử qua Groovy vì chúng được dùng nhiều để build script và kiểm thử. Những trải nghiệm như thế giúp mình rất nhiều, và đó là lý do vì sao mình luôn khuyên các Java dev nên học thêm ngôn ngữ dựa trên JVM, và một trong số đó là Kotlin.

Công ty cuả Kotlin là JetBrains, đứng sau IntelliJ IDEA, Kotlin cũng là ngôn ngữ chính thức để phát triển Android theo như Google thông báo năm 2017, không những cải thiện hiệu suất mà còn giúp bạn đào sâu hơn về lĩnh vực phát triển Android.

Học về Microservices (Spring Cloud, MicroNaut)

Architecture là lĩnh vực không ngừng thay đổi, và càng nhiều công ty đang chuyển hướng từ monolithic sang microservice. Vì vậy đã đến lúc Java dev học về microservice architecture và làm thế nào để tạo microservice trong java để hưởng lợi từ cơn sóng này. Và Spring framework có Spring Cloud và Spring Boot để đơn giản hóa quá trình develop microservice trong Java.

Học về IDE (Eclipse hoặc IDEA)

Một trong những đặc điểm của các Java dev xịn là họ rất rành các tool mình sử dụng. Các IDE như Eclipse, NetBeans và IntelliJ IDEA là công cụ quan trọng nhất đối với Java dev cho nên bạn nên dành thời gian cho chúng nhiều để tìm hiểu kỹ càng hơn. Ngoài ra thì bạn cũng có thể tìm hiểu một số plugin hỗ trợ làm task hoặc một số phím tắt để nâng cao năng suất của mình.

Java tips 10 - Learn Your IDE Better

Những mẹo nhỏ này sẽ giúp cho công việc nhiều hơn bạn nghĩ đó.

Trên đây là các tips của mình để trở thành một Java dev xịn xò hơn năm 2020, và để follow hết những cái trên cũng khá là thử thách, nhưng điều đó cũng không cần thiết lắm đâu. Bạn có thể tập trung vào cái gì quan trọng với bản thân hơn, như học tính năng Java mới giữa Java 8 và Java 13, hoặc Spring Framework nếu chưa biết gì về nó. Nhưng nếu đã rành những cái này rồi thì cũng có thể chọn hướng khác, như unit testing, JVM hay DevOps.

Tham khảo bài viết gốc tại javarevisited

► Xem thêm việc làm Java Developer HCM hấp dẫn tại TopDev


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

10 tip tối ưu code trên JavaScript mà web developer nào cũng nên biết

javascript là gì
10 tip tối ưu code trên JavaScript mà web developer nào cũng nên biết

Tác giả: Gert Svaiko

Giới thiệu

JavaScript là gì? Đây là một ngôn ngữ lập trình quen thuộc và được nhiều dev sử dụng. Nếu muốn tối ưu code trong ngôn ngữ JavaScript thì việc sử dụng những mẹo hack này chắc chắn sẽ giúp bạn rất nhiều. Nó vừa giúp code của bạn sạch hơn, vừa tiết kiệm thời gian và tối ưu thời gian lập trình.

Theo thống kê của RedMonk, JavaScript là ngôn ngữ lập trình phổ biến nhất thế giới hiện nay. Hơn nữa, SlashData ước tính rằng khoảng 12,4 triệu dev sử dụng JavaScript, bao gồm cả CoffeeScript và TypeScript của Microsoft.

tối ưu code
Tối ưu code trong JavaScript giúp code sạch hơn

Điều này có nghĩa là hàng triệu dev đang sử dụng JavaScript để làm việc thông qua các trang web như UpWork và Freelancer, hoặc thậm chí bắt đầu kinh doanh phát triển web của riêng họ.

Xem thêm các việc làm tuyển dụng Javascript hấp dẫn tại TopDev

10 tip tối ưu code trong JavaScript là gì?

Sử dụng phím tắt cho câu lệnh điều kiện

Phím tắt trong JavaScript là gì? Đó là những lệnh cho phép bạn sử dụng để viết hàm. JavaScript cho phép bạn sử dụng các phím tắt nhất định để làm cho code dễ nhìn hơn. Trong một số trường hợp đơn giản, bạn có thể sử dụng toán tử logic &&|| thay ifelse.

  10 câu hỏi javascript để nâng cao trình độ

Hãy xem && toán tử đang hoạt động với cách với đoạn code dưới đây

// instead of
if (accessible) {
console.log(“It’s open!);
}
// use
accessible && console.log(“It’s open!);

|| mang ý nghĩa là “hoặc” giúp bạn thực hiện câu lệnh điều kiện của mình đơn giản hơn

// instead of
if (price.data) {
return price.data;
} else {
return 'Getting the price’';
}
// use
return (price.data || 'Getting the price');

Chuyển đổi thành tích phân thông qua toán tử

Các dev có thể loại bỏ số thập phân để trả về kết quả là một tích phân bằng cách sử dụng math.floor hoặc math.round để sử dụng dữ liệu. Một cách hiệu quả hơn là sử dụng ~~

// instead of
math.round(math.random*50)
// use
~~(math.random*50)
You can also use the “~~” operator to convert anything into a number value.
Example snippet:
~~('whitedress') // returns 0
~~(NaN) // returns 0

Thay đổi kích thước hoặc làm trống mảng bằng cách sử dụng array.length

Đôi khi các dev sẽ cần điều chỉnh kích thước mảng của mình hoặc làm trống nó. Và cách hiệu quả nhất để làm điều này là sử dụng array.length

array.length = n
var array = [a, b, c, d, e, f, g, h, i , j];
console.log(array.length); // returns the length as 10
array.length = 4;
console.log(array.length); // returns the length as 4
console.log(array); // returns “a,b,c,d”

Bạn cũng có thể sử dụng array.length để xóa tất cả các giá trị khỏi một mảng được chỉ định.

var array = [a, b, c, d, e, f, g, h, i , j];
array.length = 0;
console.log(array.length); // returns the length as 0
console.log(array);

Hợp nhất mảng vẫn không gây quá tải dữ liệu cho máy chủ

Việc hợp nhất dữ liệu là vấn đề quan trọng, có thể gây ảnh hưởng nhiều đến máy chủ nếu khối lượng dữ liệu được hợp nhất quá lớn. Để giữ mọi thứ đơn giản và duy trì mức hiệu suất, hãy sử dụng các hàm array.concat()array.push.apply(arr1, arr2). Việc sử dụng một trong hai hàm này sẽ còn tùy thuộc vào kích thước mảng.

Hãy xem cách xử lý các mảng nhỏ:

var list1 = [a, b, c, d, e];
var list2 = [f, g, h, i, j];
console.log(list1.concat(list2)); // returns the merged values of both arrays (a, b, c, d, e,f, g, h, i, j)

Ngược lại, khi sử dụng array.concat() đối với các tập dữ liệu lớn hơn, nó sẽ tiêu tốn nhiều bộ nhớ trong khi tạo một mảng mới. Để tránh tình trạng giảm hiệu suất, hãy sử dụng cách array.push.apply(arr1, arr2) hợp nhất mảng thứ hai thành mảng đầu tiên mà không cần tạo mảng mới.

var list1 = [a, b, c, d, e];
var list2 = [f, g, h, i, j];
console.log(list1.push.apply(list1, list2)); // returns the merged values of both arrays (a, b, c, d, e,f, g, h, i, j)

Cách sử dụng filters với mảng

Lọc mảng rất hữu ích khi làm việc với nhiều cột dữ liệu tương ứng. Trong trường hợp này, bạn có thể tóm gọn hoặc loại trừ dữ liệu dựa vào hàm sau filter()

const cars = [
{ make: 'Opel', class: 'Regular' },
{ make: 'Bugatti', class: 'Supercar' },
{ make: 'Ferrari', class: 'Supercar' },
{ make: 'Ford', class: 'Regular' },
{ make: 'Honda', class: 'Regular' },
]
const supercar = cars.filter(h => h.class === 'Supercar');
console.table(supercar); // returns the supercar class data in a table format

Bạn cũng có thể sử dụng filter() cùng với Boolean để trả về tất cả các giá trị null hoặc không xác định từ mảng của bạn.

cars.filter(Boolean)

Xem thêm các việc làm KMS Technology tuyển dụng hấp dẫn tại TopDev

Cách xuất ra giá trị duy nhất

Giả sử bạn có một tệp dữ liệu gồm các giá trị lặp lại và bạn cần tạo ra các giá trị duy nhất từ ​​tập hợp này. Bạn có thể làm như vậy khi sử dụng lệnh syntax ... và kiểu đối tượng Set. Cách làm này có thể thực hiện với cả dữ liệu số và chữ.

const cars = ['Opel', 'Bugatti', 'Opel', 'Ferrari', 'Ferrari', 'Opel'];
var unrepeated_cars = [...new Set(cars)];
console.log(unrepeated_cars); // returns the values Opel, Bugatti, Ferrari

Cách sử dụng phím tắt để thay thế Function Shortcut

Hãy làm quen với hàm string.replace() để việc coding của bạn trở nên nhẹ nhàng hơn. Tuy nhiên, nó chỉ thay thế một chuỗi bằng một dòng được chỉ định một lần và dừng lại từ đó. Giả sử bạn có tập dữ liệu lớn hơn và bạn cần nhập hàm này nhiều lần, nó sẽ trở nên kém hiệu quả hơn.

coding với javascript
Coding với JavaScript hiệu quả hơn

Ngoài ra, để đơn giản hơn bạn cũng có thể thêm /g vào cuối regex, để hàm chạy và thay thế tất cả các điều kiện phù hợp mà không dừng lại ở điều kiện đầu tiên.

var grammar = "synonym synonym";
console.log(grammar.replace(/syno/, "anto")); // this returns "antonym synonym"
console.log(grammar.replace(/syno/g, "anto")); // this returns "antonym antonym"

Cách lưu các biến vào bộ nhớ cache

Khi bạn đang làm việc với các mảng lớn và cần phân loại các phần tử theo ID bằng cách sử dụng getElementById() hoặc theo tên lớp bằng cách sử dụng getElementsByClassName(), thì JavaScript chạy qua mảng trên một vòng lặp với mỗi yêu cầu phần tử tương tự. Điều này có thể chiếm rất nhiều tài nguyên.

Xem thêm các việc làm tuyển dụng Tester hấp dẫn tại TopDev

Tuy nhiên, bạn có thể tăng hiệu suất bằng cách lưu vào bộ nhớ đệm một biến nếu dữ liệu đó được bạn sử dụng thường xuyên.

var carSerial = serials.getElementById('serial1234');
carSerial.addClass('cached-serial1234');

Cách kiểm tra giá trị đối tượng

Khi bạn đang làm việc với nhiều object, sẽ khó theo dõi xem đối tượng nào chứa giá trị thực và đối tượng nào bạn có thể xóa. Đây là một thủ thuật nhanh về cách kiểm tra xem một đối tượng trống hoặc có giá trị với hàm Object.keys().

Object.keys(objectName).length // if it returns 0 then the Object is empty, otherwise it displays the number of values

Cách giảm độ lớn của tệp JavaScript

Các tệp JavaScript lớn sẽ ảnh hưởng đến hiệu suất tải và tốc độ phản hồi trang. Trong khi coding bạn có thể bị ảnh hưởng với các nhận xét và dead code không cần thiết. Tùy thuộc vào kích thước tệp của bạn, nó có thể trở nên nhiều hơn và nặng hơn với bộ nhớ của máy.

  JavaScript là gì? Internet có thể tồn tại mà không có JavaScript hay không?

Có một số công cụ giúp bạn làm sạch mã và làm cho các tệp JS nhẹ hơn – hoặc giảm độ lớn của file. Mặc dù việc thu nhỏ tệp JS không phải là một sự cố nghiêm trọng nhưng nó vẫn có lợi cho các dev hơn khi biết và thực hiện.

Một trong những ứng dụng đó là Google Closure Compiler của Google, nó cho phép người dùng phân tích cú pháp JavaScript, loại bỏ dead code, viết lại và giảm dung lượng những phần còn lại. Ứng dụng thứ hai là Microsoft Ajax Minifier cho phép cải thiện hiệu suất của ứng dụng web bằng cách giảm kích thước tệp JavaScript.

Kết luận

Trên đây là 10 thủ thuật hay ho mà các dev có thể sử dụng để code của mình sạch sẽ và gọn gàng hơn. Từ đó sẽ vừa tiết kiệm thời gian vừa duy trì khả năng lập trình tốt hơn trên máy chủ.

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

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

Xem thêm việc làm tuyển dụng IT hấp dẫn tại TopDev

Tips lời khuyên giúp nhà tuyển dụng phỏng vấn ứng viên hiệu quả

phỏng vấn
phỏng vấn

Tuyển dụng và phỏng vấn ứng viên không còn quá xa lạ. Vì nó là công việc đặc thù không riêng ngành nhân sự. Quan trọng nhất vẫn là sự phù hợp dựa vào sự đánh giá của nhà tuyển dụng.

Để giúp bạn tự tin hơn, TopDev sẽ chỉ ra một vài điều quan trọng cần ghi nhớ khi bạn thực hiện một cuộc phỏng vấn.

Hãy giữ một tâm trí cởi mở

Điều đầu tiên là giữ một tinh thần thoải mái. Điều này đảm bảo tất cả các bên tham gia vào quá trình tuyển dụng đạt hiệu quả cao nhất.  

phỏng vấn

Hãy tiếp cận cuộc phỏng vấn như cách tự tạo cho mình một cơ hội. Nhân sự có thể cảm nhận hướng sẽ học được nhiều điều từ họ. Một cuộc phỏng vấn thành công phải đạt được hiệu quả tương tác ở cả hai chiều. Và tất nhiên không nên có chỗ cho những phán xét.

Đừng quá lo lắng! Và hãy bắt đầu cuộc phỏng vấn bằng một thái độ tích cực, một tâm trí cởi mở, lạc quan nhất. Chia sẻ những mối quan tâm chung của ứng viên; đặt ra những câu hỏi tương tác là cách mở đầu khá hoàn hảo. Vì nó vừa làm dịu đi bầu không khí căng thẳng của buổi phỏng vấn. Đơn gian vì nó vừa tạo ra sự kết nối ban đầu – đó là yếu tố quan trọng.

Tập trung vào ứng viên

Người phỏng vấn có thể nghiên cứu hoặc nắm được những thông tin cơ bản. Nhưng phải chính xác về các ứng viên. Việc nhà tuyển dụng nắm các thông tin của các ứng viên trước đó sẽ giúp khoanh vùng và giới hạn một số ứng viên tạo được ấn tượng tốt. Từ đó, việc xem xét và phán đoán các ứng viên đáp ứng đủ nhu cầu về vị trí sẽ dễ dàng hơn.

Nhà tuyển dụng cần tập trung vào ứng viên. Đừng xao nhãng vào các vấn đề khác như hình thức bên ngoài. Tạo một không gian thoải mái nhất để ứng việc có thể tự tin chia sẻ mọi thứ về bản thân mình. Chính sự tập trung thông qua các mô tả của họ, nhà tuyển dụng freelancer it sẽ có thể hiểu được ít nhiều phần nào năng lực họ sở hữu.

Tạo CV Online mới nhất cho IT

Đặt câu hỏi cẩn thận

Hãy đặt câu hỏi một cách thận trọng. Đừng hỏi những câu hỏi hoặc đưa ra các lời bình luận ngụ ý về sự thiên vị; phân biệt đối xử; hoặc đi quá xa vào cuộc sống cá nhân của các ứng viên. Chẳng hạn như những vấn đề liên quan đến giới tính, tôn giáo, tình trạng hôn nhân hoặc kế hoạch hóa gia đình,… Đó đều là những vấn đề khá nhạy cảm và cần bạn lưu ý. 

Một điểm lưu ý nữa, là người trực tiếp phỏng vấn ứng viên, bạn không nên tham gia vào bất kỳ bình luận tiêu cực nào về sếp, đồng nghiệp hoặc công ty cũ của ứng viên.

  Rời bỏ công việc tại các doanh nghiệp nhỏ - Nguyên nhân và giải pháp

phỏng vấn

Trong cuộc phỏng vấn, các ứng viên sẽ chia sẻ nhiều thứ để thể hiện mình. Và tất nhiên, điều nhà tuyển dụng it cần làm là tương tácnắm bắt tốt những chia sẻ đó để có thể phân tích chính xác các khía cạnh khác nhau của một ứng viên.

Hãy lưu tâm: cách ứng viên họ mô tả về công việc quá khứ là cách tốt nhất để người phỏng vấn hiểu rõ hơn về lịch sử công việc và hành trình phát triển trong nghề nghiệp của họ.

Nắm bắt tốt tâm lý ứng viên

Ứng viên khó tránh khỏi những cảm giác căng thẳng trong quá suốt quá trình phỏng vấn. Một nụ cười đơn giản, một cái bắt tay hay một lời hỏi han sẽ có thể làm xoa dịu đi phần nào áp lực hiện tại của ứng viên. Đồng thời, giúp họ thoải mái hơn để trở về trạng thái cảm xúc cân bằng; sẵn sàng chinh phục buổi phỏng vấn. 

phỏng vấn

Nếu một ứng viên quá lo lắng đến mức họ không thể trả lời câu hỏi của bạn, người phỏng vấn nên đọc lại câu hỏi ; thêm một ví dụ minh họa hoặc giải thích chi tiết hơn về câu hỏi. Điều này không mất quá nhiều thời gian mà chỉ tạo cơ hội để ứng viên có đủ điều kiện bộc lộ hết những gì mình có.

Đôi khi nhiều do số lượng ứng viên quá nhiều, người phỏng vấn dường như quên mất việc giải thích. Điều này vô tình dẫn đến việc mặc định đánh giá ứng viên là thiếu chuyên nghiệp.

Tâm lý là điều quan trọng dẫn đến sự thành công của buổi phỏng vấn. Có thể bạn hơi sợ hãi lúc ban đầu. Những sau đó, bạn cho nhà tuyển dụng freelancer it thấy được sự cố gắng qua những câu trả lời đúng trọng tâm. Chắc chắn bạn không phải là ứng viên biết tư duy tốt về ngôn ngữ nhưng những gì bạn nói đều có giá trị. Đừng hoang mang mà hãy thể hiện đúng con người của bạn.

Lời kết

Hãy tin rằng một cuộc phỏng vấn tuyệt vời luôn là kết quả của một cuộc trò chuyện tuyệt vời. TopDev hi vọng đây là những chia sẻ bổ ích dành cho các bạn. Từ đó, các bạn sẽ có cho mình những lời khuyên thật sự có giá trị.


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

Có thể bạn quan tâm

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

Những tựa sách nổi tiếng dành cho Software Developer – Phần 1

Những tựa sách nổi tiếng dành cho Software Developers

Tác giả: Andrew

Giới thiệu

Để thành công, không ai trong chúng ta không cần những lời khuyên giá trị từ những người đi trước. Những lời khuyên đó sẽ được đúc kết từ nhiều người, nhiều thế hệ và đã được chứng minh tính hợp lí của nó thông qua kết quả thực tế mà họ đạt được. Và sách chính là nơi chứa đựng những tinh túy ấy. Dưới đây tôi sẽ đề cập đến những tựa sách cho Software Developer đã được nhiều dev đánh giá là cực kỳ hữu ích với công việc hàng ngày của họ.

software developer
Những tựa sách chất lượng sẽ giúp bạn có thêm kiến thức về software developing

Những cuốn sách được các Software Developer lựa chọn nhiều nhất

1. Clean Code: A Handbook of Agile Software Craftsmanship – Robert C. “Uncle Bob” Martin

Robert C. Martin là một Software Developer nổi tiếng thế giới. Trong cuốn sách này, Robert cùng các đồng nghiệp của anh ấy ở Object Mentor đã giới thiệu về những mô hình mang tính cách mạng về cách làm sạch code, loại bỏ những code xấu một cách nhanh nhất để công việc của bạn trở nên hiệu quả hơn.

Xem thêm các việc làm Tester hấp dẫn tại TopDev

Nhiều người dùng đánh giá rằng cuốn sách này sẽ tạo ra những thách thức trong suy nghĩ của bạn về cách clean code và code như thế nào là code xấu. Quan trọng hơn, các Software Developer sẽ tìm được những thông tin hữu ích để đánh giá lại các giá trị trong nghề nghiệp và chuyên môn của mình.

  Biến Git và GitHub trở thành công cụ đắc lực cho Software Engineer
  Cách viết CV dành cho Software Developer

2. The Pragmatic Programmer: From Journeyman to Master – Andrew Hunt and Dave Thomas

Dev là những người làm việc dựa vào việc sử dụng một bộ công cụ nhất định (như trình chỉnh sửa, trình quản lý đối tượng, trình theo dõi phiên bản) để build một loại sản phẩm hay một chương trình trong một số môi trường (như các hệ điều hành trên các cụm phần cứng). Những gì mà các dev tạo ra được xem là các tài nguyên trí tuệ, hầu hết trong số đó không được dạy ở các trường học mà chúng được xem là thủ thuật giao dịch theo thời gian, thông qua thử nghiệm độc lập. Trong cuốn The Pragmatic Programmer, Andrew Hunt và David Thomas đã hệ thống hóa những sự thật mà họ đã khám phá ra trong sự nghiệp làm lập trình viên mà cụ thể là những Software Developer.

Xem thêm Software Developer và 5 bài học kinh nghiệm quan trọng

Cuốn sách cho Software Developer này sẽ thu hút bạn với hai lý do: Nó sẽ cho thấy những kiến thức mà bạn đã tích lũy được trong suốt thời gian qua hiện lên một cách rõ ràng hơn, và nó giới thiệu cho bạn những phương pháp làm việc mà bạn có thể chưa tính đến. Những Software Developer đang bắt đầu tiến trình đẩy nhanh công việc của mình sẽ là đối tượng phù hợp với cuốn sách này nhất.

Xem thêm các việc làm KMS Technology tuyển dụng hấp dẫn tại TopDev

3. Code Complete: A Practical Handbook of Software Construction – Steve McConnell

Được nhiều người coi là một trong những hướng dẫn thực hành tốt nhất khi học lập trình, đầu sách Code Complete của Steve McConnell đã giúp các dev viết phần mềm tốt hơn trong hơn một thập kỷ qua. Giờ đây, cuốn sách cổ điển này đã được cập nhật và sửa đổi đầy đủ với các tool và kỹ thuật tiên tiến hơn trong việc xây dựng phần mềm.

Nắm bắt toàn bộ kiến ​​thức có sẵn từ nghiên cứu, học thuật và thực hành tạo ra các sản phẩm thương mại hàng ngày, McConnell tổng hợp các kỹ thuật hiệu quả nhất và các nguyên tắc cần biết thành hướng dẫn rõ ràng, thực tế. Bất kể mức độ kinh nghiệm, môi trường phát triển hay quy mô dự án của bạn là bao nhiêu, cuốn sách này sẽ cung cấp thông tin và kích thích tư duy của bạn, đồng thời giúp bạn viết code chất lượng cao nhất.

tài liệu cho software developer
Những sách tốt sẽ cung cấp cho các dev giá trị hữu ích

4. Design Patterns: Elements of Reusable Object-Oriented Software – Erich Gamma, Richard Helm, and Ralph Johnson

Cuốn sách cho Software Developer này không phải là sản phẩm giới thiệu đơn thuần về công nghệ hoặc thiết kế trong hướng đối tượng. Cuốn sách này sẽ mang đến cho các Software Developers các mẫu thiết kế mô tả những giải pháp đơn giản và thanh lịch cho mỗi vấn đề cụ thể trong thiết kế phần mềm hướng đối tượng. Bạn sẽ có nhận thức mới hoàn toàn về vấn đề và những thông tin chi tiết có thể làm cho thiết kế của bạn trở nên linh hoạt và dễ hiểu.

5. Refactoring: Improving the Design of Existing Code – Martin Fowler

Trong hơn 20 năm qua, các lập trình viên có kinh nghiệm trên toàn thế giới đã dựa vào cuốn sách này của Martin Fowler để cải thiện thiết kế của code cũng như tăng cường khả năng bảo trì phần mềm, giúp code trở nên gọn gàng và dễ hiểu hơn.

Phiên bản tái bản lần này của Refactoring: Improving the Design of Existing Code giống với bản gốc. Trong đó nó sẽ giải thích tái cấu trúc là gì, tại sao bạn nên cấu trúc lại, cách nhận ra mã cần cấu trúc và làm thế nào để thực sự thực hiện thành công, bất kể bạn sử dụng ngôn ngữ nào.

  Sự thật ẩn giấu đằng sau những dòng code

6. The Mythical Man-Month: Essays on Software Engineering – Frederick P. Brooks

Phải khẳng định rằng có rất ít những cuốn sách nói về quản lý dự án phần mềm có tầm ảnh hưởng và vượt thời gian như The Mythical Man-Month. Với sự pha trộn giữa các thông tin thực tế về kỹ thuật phần mềm và các ý kiến mang tính tư duy của riêng tác giả, Fred Brooks đã cung cấp cho người đọc những thông tin chi tiết trong việc quản lý các dự án phức tạp.

Xem tuyển dụng software developer đãi ngộ tốt trên TopDev

7. Working Effectively with Legacy Code – Michael Feathers

Code bạn viết có dễ thay đổi không? Bạn có thể nhận được phản hồi gần như tức thời khi bạn thay đổi nó không? Bạn có thật sự hiểu nó không? Nếu câu trả lời của bạn là không, bạn có code kế thừa và nó đang tiêu hao thời gian và tiền bạc từ những nỗ lực phát triển của bạn.

Trong cuốn sách cho Software Developer này, Michael Feathers đưa ra đầy đủ các chiến lược để làm việc hiệu quả hơn với các cơ sở code kế thừa lớn chưa được kiểm tra. Cuốn sách này dựa trên tài liệu mà Michael đã tạo ra cho các cuộc hội thảo về Object Mentor nổi tiếng của mình: các kỹ thuật mà Michael đã sử dụng trong việc cố vấn để giúp hàng trăm nhà phát triển, nhà quản lý kỹ thuật và người kiểm tra đưa hệ thống kế thừa của họ vào tầm kiểm soát.

Kết luận

Những cuốn sách được đề xuất trên đây đều nằm trong top tìm kiếm và có lượt mua cao trên Google. Với các Software Developers, đây chắc chắn sẽ là nguồn tài nguyên thông tin hữu ích giúp các dev chinh phục công việc của mình mỗi ngày.

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

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

Xem thêm việc làm tuyển dụng lập trình viên hấp dẫn tại TopDev

Tìm hiểu về Headless Browser trong Selenium Webdriver

Tìm hiểu về Headless Browser trong Selenium Webdriver

Bài viết được sự cho phép của tác giả Vân Anh

Hôm nay sẽ cùng các bạn tìm hiểu về một dạng trình duyệt kỳ lạ được sử dụng trong automation, trong tiếng Việt nôm na nó là “trình duyệt không đầu” nhưng được biết đến rộng rãi hơn với cái tên quốc tế khá là trừu tượng giống như sự hiện diện của nó, đó là “headless browser” :v

Và không làm mất thời gian thêm nữa, cùng đi vào nội dung chính thôi nào.

  Redux selector và vấn đề sử dụng sao cho hiệu quả
  Selenium – Xác Định Đối Tượng UI

1. Headless Browsers trong Selenium Webdriver

Headless browser là chương trình giả lập một trình duyệt nhưng không có giao diện người dùng (UI less).

Cơ chế hoạt động của Headless browser tương tự như các trình duyệt thông thường khác, chỉ có điều là nó sẽ không xuất hiện hay hiển thị bất kì giao diện tương tác người dùng nào. Do đó, Selenium sẽ thực thi việc test với trình duyệt này ở chế độ nền (background).

Hiện nay có khá là nhiều các loại Headless browser, được biết đến nhiều hơn cả đó là:

  • Chrome
  • Firefox
  • HTMLUnit driver
  • PhantomJS
  • SlimerJS
  • TrifleJS

2. Headless testing là gì?

Việc thực hiện kiểm thử giao diện của ứng dụng web mà không cần mở ứng dụng trên giao diện người dùng của trình duyệt thì được gọi là headless testing. Một headless browser hoạt động giống như một trình duyệt web thông thường. Các tester có thể toàn quyền điều khiển các trang web được tải trên headless browser. Chỉ có một điều khác biệt là khi đó bạn sẽ không thể nhìn thấy bấy kì một giao diện đồ họa người dùng nào – giống như kiểu bạn đang đi trong đêm tối hoàn toàn không có ánh sáng nhưng mà bạn vẫn có thể đi những bước đi chính xác qua những đoạn cong queo, ngoằn nghoèo để đến được đích =))

3. Khi nào thì sử dụng headless browser testing?

Ta có thể sử dụng headless testing sau khi đã hoàn thành việc kiểm thử trên các trình duyệt thông thường khác và khi cần thực hiện việc kiểm thử hồi quy trong các phiên bản phát hành hoặc phát triển tích hợp liên tục sau đó.

Hoặc trong trường hợp máy test của bạn không thể cài đặt hay sử dụng trình duyệt GUI, thì headless browser testing có lẽ là lựa chọn ổn hơn cả. Ví dụ khi test trên Unix chẳng hạn. 😀

Bạn cũng nên sử dụng headless browser testing khi thực thi song song nhiều test cùng lúc, lúc này với các trình duyệt giao diện sẽ tiêu tốn nhiều bộ nhớ và tài nguyên. Headless browser testing có thể được sử dụng để kiểm tra hiệu năng của server (máy chủ).

Headless browser cũng có thể sử dụng khi bạn thực hiện smoke test ngay khi được bàn giao phiên bản mới, sẽ nhanh chóng kiểm tra và từ chối bàn giao nếu phát hiện vấn đề.

4. Một số nhược điểm của headless browser testing

Nhìn chung, headless browser không phải là một ý tưởng thực sự tốt. Nó có thể thực hiện các công việc tương tự nhưng một điều quan trọng là nó không mang được sự trực quan giống như một người dùng thực sự sẽ nhìn thấy và tương tác. Headless browser có thể che dấu những vấn đề mà chỉ khi sử dụng những trình duyệt thông thường bạn mới gặp phải.

Với headless browser sẽ khó debug để xác định các phần tử có vấn đề do page load quá nhanh.

Với trình duyệt thông thường, các chức năng được thực thi hoạt động ngay trước mắt, do đó ta có thể dễ dàng tương tác và phán hiện các điểm sai sót, cũng sẽ dễ dàng debug hơn nếu như có một vấn đề nào đó xảy ra.

Các mã code cho các headless browser không đảm bảo sẽ hoạt động bình thường khi chúng ta chuyển từ một headless browser nào đó sang HTMLUnit, ví dụ như bạn code cho Headless Chrome hay Firefox, và sau đó lại muốn thay đổi để code chạy cho Headless HTMLUnit, việc này đôi khi có thể làm cho code của chúng ta hoạt động không đúng nữa, nên hoặc là bạn không chuyển nữa hoặc là ngồi sửa code những đoạn nào không tương thích 😀 . Tuy nhiên giữa Chrome và Firefox thì lại khá là tương đồng, nên sẽ dễ dàng hơn nhiều nếu muốn nhảy từ cái này sang cái kia.

Tương tác trên Headless browser không thể đại diện cho một người dùng thật sự, vì chẳng người dùng nào lại có thể tương tác các tác vụ mà không nhìn thấy bất cứ một giao diện hay hình ảnh nào cả, và vì vậy ta sẽ không thể phát hiện ra vấn đề nếu như vấn đề đó liên quan đến các hình ảnh trên ứng dụng.

Trên thực tế headless brower không nhanh hơn trình duyệt thực, bởi vì phần lớn thời gian vẫn để tải dữ liệu phụ thuộc vào tốc độ mạng, htlm, Javascript, hình ảnh và CSS. Headless browser chỉ không cần tải màu cho màn hình mà thôi.

Việc quản lý và chụp ảnh màn hình khá là khó đối với Headless browser.

5. Headless browser automation trong Selenium Java

Chúng ta có thể thực hiện automation với headless browser, và chỉ có automation mới có thể thực thi được trên headless browser.

Đối với vai trò của một người dùng, họ sẽ chẳng quan tâm và cũng không có khái niệm nào về Headless browser hay UI less browser.  Vì với những khái niệm này trên thực tế rõ ràng là không thể trông thấy hay tương tác trực tiếp được.

Trên headless browser, có thể thực thi các test mà được tạo ra dựa trên việc thực hiện trên các trình duyệt UI thông thường, do đó việc debug cũng chỉ có thể thực hiện trên trình duyệt UI thông thường mà thôi.

Trong bài viết này chúng ta sẽ đi qua các Headless browser đó là:

  1. Chrome
  2. Firefox
  3. HtmlUnit browser
  4. PhantomJS

5.1. Headless Chrome trong Selenium

Headless Chrome được hỗ trợ bởi Chrome phiên bản 59+. Với Selenium webdriver, ta có thể sử dụng headless browser chrome bằng cách sử dụng class trong org.openqa.selenium.chrome.ChromeOptions

Với Mac và Linux từ Chrome 59 cũng đã có hỗ trợ headless browser mode, hệ điều hành Windows cũng đã hỗ trợ đến version 60.

Các bước để tạo headless Chrome:

1. Set path cho Chrome driver server sử dụng System.setProperty:

System.setProperty("webdriver.chrome.driver", 
                                "C:/Users/user/Pictures/chromedriver.exe");

2. Tạo một đối tượng cho ChromeOptions thuộc packet org.openqa.selenium.chrome.ChromeOptions: 

ChromeOptions options = new ChromeOptions ();

3. Tạo một method setHeadless từ đối tượng ChromeOptions, đặt paramenter = true. Medthod này sẽ tạo ra một trình duyệt chrome mà không có giao diện người dùng, chính là cái headless Chrome browser mà ta cần:

// set chrome as Headless
options.setHeadless(true);

Ta cũng có thể sử dụng method addArguments có sẵn trong đối tượng ChromeOption để tạo một headless chrome browser, ở đây ta cần thêm giá trị của parameter là “—headless” để khởi tạo trình duyệt không có UI với cú pháp như sau:

options.addArguments("--headless");

4. Bây giờ bạn sẽ tạo một đối tượng cho ChromeDriver và đừng quên truyền vào đó option vừa tạo bên trên vào hàm khởi tạo ChromDirver.

WebDriver driver = new ChromeDriver(options);

Sử dụng class Option chúng ta có thể thiết lập các tính năng theo yêu cầu cho một trình duyệt (như Chrome hay Firefox)

5.2. Headless Firefox Browser in Selenium

Với headless Firefox browser ta cũng thực hiện các tương tự các bước như khởi tạo một headless Chrome browser tóm tắt nhanh các cú pháp như sau:

//set driver server exe path
System.setProperty("webdriver.gecko.driver", 
                            "C:/Users/user/Pictures/geckodriver.exe"); 
//Khởi tạo đối tượng options thuộc FirefoxOptions:
FirefoxOptions options = new FirefoxOptions(); 

//Tạo trình duyệt headless với method setHeadless với parameter = true: 
options.setHeadless(true); 

//khởi tạo trình Web Driver
WebDriver driver = new FirefoxDriver(options);

5.3. HtmlUnitDriver in Selenium

HtmlUnitDriver là một trình duyệt headless được tích hợp sẵn trong Selenium webdriver, HtmlUnitDriver nằm trong package: org.openqa.selenium.htmlunit

Khác với Headless Firefox, Chrome, với HtmlUnitDriver chúng ta chỉ cần tạo một đối tượng của class để tạo một headless browser đó.

Cú pháp chỉ đơn giản như thế này:

HtmlUnitDriver driver = new HtmlUnitDriver();
driver.get("https://www.google.com");

5.4 .PhantomJS Headless browser

Dưới đây là đoạn code mà mình đã sử dụng để khởi tạo một trình duyệt PhantomJS. Tuy nhiên theo mình đọc được đâu đó thì chúng ta nên chuyển sang sử dụng Google chrome hơn là PhantomJS, vì tốc độ và độ ổn định được đánh giá tốt hơn so với PhantomJS.

File file = new File("C:/Program Files/phantomjs-2.1.1-windows/phantomjs-2.1.1-windows/bin/phantomjs.exe");
System.setProperty("phantomjs.binary.path", file.getAbsolutePath());
WebDriver browser = new PhantomJSDriver();

6. Dùng Headless browser nào nhanh hơn?

Để trả lời câu hỏi này không gì chính xác hơn là chính bạn tự kiểm chứng với môi trường thực thế của bạn. Và lựa chọn trình duyệt nào cho dự án của bạn, theo quan điểm của mình thì trước tiên cần cân nhắc đó là sự ổn định của công cụ sau đó mới đến các yếu tố khác như tốc độ hay các khả năng khác, tuy nhiên với độ phổ biến rộng rãi thì mình nghĩ rằng Chrome hay Firefox sẽ là những lựa chọn nên được ưu tiên. 😀

Hi vọng bài viết này sẽ mang lại chút hữu ích cho các bạn về Headless browser và sử dụng trong automation. Rất mong nhận được những đóng góp và góp ý của các bạn về chủ đề này.

Tham khảo thêm tại link dưới:

https://chercher.tech/java/headless-browsers-selenium-webdriver#headless

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

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

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

Str trong Python là gì? Kiểu dữ liệu chuỗi và định dạng chuỗi trong Python

Kiểu dữ liệu chuỗi và định dạng chuỗi trong Python

Bài viết được sự cho phép của tác giả Kien Dang Chung

Xử lý văn bản là công việc thường xuyên trong các ứng dụng hiện đại, văn bản có ở khắp mọi nơi, do vậy nắm vững kiến thức về kiểu chuỗi sẽ giúp bạn giải quyết được các vấn đề.

1. Kiểu dữ liệu chuỗi

Kiểu dữ liệu chuỗi – string trong Python là một trong những kiểu dữ liệu cơ bản và được sử dụng rất phổ biến trong Python, một từ, một đoạn văn bản đều là kiểu chuỗi.

Chuỗi (string) được đặt trong dấu ngoặc kép, có thể là dấu ngoặc kép đơn (”) hoặc dấu ngoặc kép đôi (“”). Ví dụ: "Hello, World!" hay 'Python'

str trong Python là một lớp (class) được sử dụng để biểu diễn và xử lý các chuỗi ký tự.

1.1 Chuỗi đơn giản

Chuỗi trong Python được đánh dấu bằng dấu nháy đơn ‘ hoặc nháy kép “, tuy nhiên nếu bắt đầu bằng dấu nào thì phải kết thúc bằng dấu đấy. Ví dụ:

first_name = "Nguyễn"
middle_name = 'Văn'

last_name = 'A" # Lỗi khi thực hiện do bắt đầu và kết thúc chuỗi khác nhau.

Khi muốn đưa các dấu nháy đơn và nháy kép vào trong chuỗi có hai cách:

Cách 1: Đóng mở chuỗi bằng dấu khác với loại dấu nháy cần đưa vào chuỗi.

speech = 'Một chuyên gia nói: "Python hiện là ngôn ngữ được nhiều người tìm hiểu nhất hiện nay", phát biểu tại Ngày hội Trí tuệ nhân tạo 2019'

sentence = "It 's my car"

Cách 2: Sử dụng dấu gạch chéo \, dấu này giúp Python nhận biết là phải bỏ qua ngữ nghĩa của ký tự ngay sau.

example = "Trong một câu có thể có nhiều dấu \" và dấu \' với số lượng tùy ý"

Tuyển dụng lập trình python lương cao cho bạn

1.2 Chuỗi ký tự nhiều dòng

Python hỗ trợ kiểu dữ liệu chuỗi có thể chứa đoạn văn với nhiều dòng bằng cách bắt đầu và kết thúc chuỗi bằng 3 dấu nháy kép “””. Ví dụ:

chuoi_nhieu_dong = """
Một chuyên gia phát biểu:

- \"Python là ngôn ngữ được yêu thích nhất hiện nay\".

Chuyên gia này phát biểu tại Ngày hội Trí tuệ nhân tạo 2019.
"""

Có thể áp dụng chuỗi ký tự nhiều dòng khi comment code, trong Python khi ghi chú thông tin chúng ta sử dụng dấu # ở đầu câu ghi chú, với ghi chú nhiều dòng chúng ta cần nhiều dấu # ở trước các dòng.

# Khóa học Python từ A đến Z
# Bài số 3: Kiểu dữ liệu chuỗi.

# Ví dụ 1: In ra chuỗi "Hello world"
loi_chao = "Hello world"
print(loi_chao)

Nếu đoạn ghi chú dài, việc sử dụng các dấu # là rất bất cập, chúng ta có thể sử dụng chuỗi đa dòng để ghi chú như sau:

""" 
Khóa học Python từ A đến Z
Bài số 3: Kiểu dữ liệu chuỗi.

Ví dụ 1: In ra chuỗi \"Hello world\"
"""
loi_chao = "Hello world"
print(loi_chao)
  Cú pháp cơ bản trong lập trình Python
  Biến và kiểu dữ liệu cơ bản trong Python

2. Thao tác với các biến kiểu chuỗi

2.1 Nối chuỗi

Chúng ta có thể nối các chuỗi với nhau thành một chuỗi thông qua toán tử +. Ví dụ:

first_name = "Nguyễn"
middle_name = 'Văn'
last_name = "A"

full_name = first_name + " " + middle_name + " " + last_name
print(full_name)

# Kết quả là Nguyễn Văn A

Chú ý, toán tử nối chuỗi chỉ thực hiện được khi các thành phần là chuỗi, ví dụ dưới đây sẽ gây ra lỗi:

age = 35

print("Tuổi của bạn là:" + age)

Do biến age là kiểu số, toán tử nối chuỗi sẽ bị lỗi, nếu muốn nối chuỗi bạn phải chuyển đổi kiểu số sang kiểu chuỗi với hàm str().

age = 35

print("Tuổi của bạn là:" + str(age))

2.2 Độ dài của chuỗi

Đôi khi chúng ta muốn xác định độ dài của một chuỗi để có thể cắt bớt hoặc xử lý cho phù hợp. Ví dụ, tiêu đề của một bài viết là dưới 70 ký tự khi đó chúng ta cần xác định độ dài tiêu đề bài viết. Trong Python sử dụng hàm len() để xác định độ dài chuỗi.

title = "Kiểu dữ liệu chuỗi ký tự và định dạng chuỗi trong Python"
print(len(title))

# Kết quả là 56

2.3 Các phương thức của str trong Python

Mọi chuỗi trong Python đều là đối tượng str, do đó bản thân nó có rất nhiều các hàm nội tại dùng để thao tác với nội dung của chuỗi. Cú pháp sử dụng các hàm str trong Python như sau:

variable_string = "Some thing"
variable_string.methodname(params)
  • str.lower(): Chuyển đổi tất cả các ký tự trong chuỗi thành chữ thường.
  • str.upper(): Chuyển đổi tất cả các ký tự trong chuỗi thành chữ hoa.
  • str.strip(): Loại bỏ các khoảng trắng từ đầu và cuối chuỗi.
  • str.replace(old, new): Thay thế tất cả các xuất hiện của chuỗi con old bằng chuỗi new.
  • str.split(separator): Tách chuỗi thành danh sách các chuỗi con dựa trên ký tự phân cách separator.
  • str.join(iterable): Kết hợp các chuỗi từ một iterable thành một chuỗi duy nhất với ký tự phân cách.
  • isalpha: trả về true nếu chuỗi chỉ chứa chữ cái A-Z và a-z.
  • isnumeric: trả về true nếu chuỗi chứa chỉ các chữ số 0-9.
  • find(x, [y.z]): trả về số lần chuỗi x được tìm thấy trong chuỗi gốc, tùy chọn [y.z] giới hạn vị trí tìm kiếm, trả về -1 nếu không tìm thấy.
  • replace(x, y): thay thế chuỗi x thành chuỗi y trong chuỗi gốc.

Ví dụ:

my_name = "Nguyen Van A"

print(my_name.isalpha) # trả về true
print(my_name.isnumeric) # trả về false
print(my_name.lower) # trả về nguyen van a
print(my_name.upper) # trả về NGUYEN VAN A
print(my_name.find("an")) # trả về 1
print(my_name.replace("Nguyen", "Tran")) # trả về Tran Van A

Tuyển dụng python Hồ Chí Minh mới nhất trên TopDev

3. Định dạng chuỗi

3.1 Định dạng với F-string

Định dạng f-string khá đơn giản khi sử dụng, tất cả những gì cần là một chữ f đứng trước một chuỗi thì tất cả các biểu thức (nằm trong cặp đóng mở ngoặc nhọn) sẽ được thực thi và chuyển đổi thành chuỗi và thay thế vào biểu thức đó. Trong ví dụ ở phần trên

age = 35

print("Tuổi của bạn là:" + str(age))

Chúng ta có thể sử dụng định dạng f-string như sau:

age = 35

print(f"Tuổi của bạn là: {age}")

Biểu thức trong {age} sẽ được tính toán và chuyển đổi thành chuỗi và thay thế lại vị trí cũ, do đó kết quả nhận được là “Tuổi của bạn là: 35”. Một ví dụ khác sẽ giúp bạn hiểu rõ hơn:

don_gia = 25000
chiet_khau = 0.25
so_luong = 3

print(f"Bạn mua {so_luong} dia com het tong cong: {don_gia * so_luong} VND")
# Kết quả in ra: Ban mua 3 dia com het tong cong: 75000 VND

print(f"Bạn mua {so_luong} dia com het tong cong: {don_gia * so_luong:,} VND")
# Kết quả in ra: Ban mua 3 dia com het tong cong: 75,000 VND

print(f"Ban duoc chiet khau {chiet_khau:.2%}")
# Kết quả in ra: Ban duoc chiet khau 25%

F-string cũng cho phép chúng ta định dạng số với các dấu phân cách hàng nghìn (,) hoặc định dạng số theo phần trăm (.2%). Một điểm chú ý là f-string nếu sử dụng cho biến số sẽ không thay đổi giá trị khi các thành phần của biến số thay đổi.

don_gia = 25000
so_luong = 3
thong_bao = f"Bạn mua {so_luong} dia com het tong cong: {don_gia * so_luong} VND"

print(thong_bao)
# Kết quả in ra: Ban mua 3 dia com het tong cong: 75000 VND

don_gia = 35000
so_luong = 5

print(thong_bao)
# Kết quả in ra: Ban mua 3 dia com het tong cong: 75000 VND

Kiểu dữ liệu chuỗi và định dạng chuỗi trong Python

Bạn thấy đấy, khi thay đổi số lượng và đơn giá nhưng thông báo in ra vẫn giữ nguyên.

  Lệnh if, elif, if else trong Python là gì?

3.2 Định dạng chuỗi với phương thức format()

Bản thân biến dạng chuỗi là một đối tượng str có một hàm nội tại là format() dùng để định dạng nội dung. Ví dụ dưới đây sử dụng hàm format() trong Python:

ten_nguoi_dung = "Nguyen Van A"
cau_chao = "Chao ban {}!"
cau_chao_a = cau_chao.format(ten_nguoi_dung)
print(cau_chao_a)

Nếu bạn muốn có nhiều biến được đưa vào trong nội dung chuỗi, chúng ta cần phải đặt tên cho các vị trí này. Ví dụ:

don_gia = 25000
so_luong = 3
tong_tien = don_gia * so_luong
mau_thong_bao = "Bạn mua {so_luong} dia com het tong cong: {tong_tien} VND"

thong_bao = mau_thong_bao.format(so_luong=so_luong,tong_tien=tong_tien)
print(thong_bao)

don_gia = 35000
so_luong = 5
tong_tien = don_gia * so_luong
mau_thong_bao = "Bạn mua {so_luong} dia com het tong cong: {tong_tien} VND"

thong_bao = mau_thong_bao.format(so_luong=so_luong,tong_tien=tong_tien)
print(thong_bao)

Kết quả chúng ta đạt được như mong muốn.

Kiểu dữ liệu chuỗi và định dạng chuỗi trong Python

Trong một số ví dụ, tôi có sử dụng Jupyter Notebook chạy trên máy cá nhân, nếu bạn muốn tìm hiểu về phần mềm này có thể tham khảo bài viết Jupyter Notebook công cụ không thể thiếu khi học Python.

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

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

Thực thi phương thức kiểm thử NUnit với Command Line

Thực thi phương thức kiểm thử NUnit với Command Line

Bài viết được sự cho phép của vntesters.com

Bên cạnh việc thực thi các phương thức kiểm thử NUnit với ứng dụng, chúng ta còn có thể ra lệnh thực thi các phương thức kiểm thử với Command Line. Điều này thật sự hữu ích khi chúng ta muốn thiết lập kiểm thử tự động theo lịch (schedule).

  NUnit – Kiểm thử Đơn vị trên Visual Studio
  Kiểm thử đơn vị trong C# với Nunit và .Net Core

Chương trình NUnit-Console

NUnit-Console là một chương trình DOS, không có giao diện, được gọi thông cửa sổ Command Line. Kết quả sau khi thực thi sẽ được trả về bằng một tập tin XML. Các lựa chọn (option) cho chương trình NUnit-Console này được chia làm 4 nhóm: Lựa chọn phương thức kiểm thử; Thiết lập quá trình thực thi; Thiết lập đầu ra (output) sau khi thực thi  Các lựa chọn khác.

Thực thi phương thức kiểm thử NUnit với Command Line

Lựa chọn phương thức kiểm thử để thực thi

Về mặc định, khi chúng ta gọi chương trình NUnit-Console với một tập tin, NUnit-Console sẽ chạy toàn bộ phương thức kiểm thử có trong tập tin đó. Loại tập tin được hỗ trợ bởi NUnit-Console là: dll, csproj và nunit. Những phương thức kiểm thử nào được đánh dấu Ignore sẽ không được thực thi. Khi gọi chương trình NUnit-Console, chúng ta có thể thực thi một lần nhiều tập tin, cách nhau bằng một khoảng trắng.

unit-console [tập tin dll/csproj/nunit]
unit-console [tập tin dll/csproj/nunit] [tập tin dll/csproj/nunit] [tập tin dll/csproj/nunit]

Thay vì thực thi toàn bộ phương thức kiểm thử có trong dự án kiểm thử, chúng ta có thể lựa chọn thực thi những không gian tên/lớp/phương thức kiểm thử nào chúng ta muốn với hai option: /run và /fixture. Để xác định một lớp/phương thức kiểm thử, chúng ta phải cung cấp tên của lớp/phương thức một cách đầy đủ, bắt đầu từ không gian tên.

Với /run, chúng ta có thể cung cấp nhiều hơn một phương thức/lớp/không gian tên để thực thi. Mỗi phương thức/lớp/không gian tên được cách nhau bằng một dấu phẩy (,).

nunit-console /run:[phương thức kiểm thử],[lớp kiểm thử],[không gian tên] [tập tin dll/csproj/nunit]

Thực thi phương thức kiểm thử NUnit với Command Line

Với /fixture, chúng ta có thể thực thi một lớp kiểm thử hoặc một tập hợp các phương thức kiểm thử thông qua từ khóa Suite (đã được nói tại đây).

Nếu việc nhớ tên của từng lớp/phương thức kiểm thử khi chạy chương trình gây khó khăn, chúng ta có thể để tên của lớp/phương thức kiểm thử vào một tập tin và gọi một cách trực tiếp với chương trình Nunit-Console với option /runlist.

nunit-console /runlist:[tập tin chứa tên lớp/phương thức kiểm thử] [tập tin dll/csproj/nunit]

Cuối cùng, NUnit-Console cho chúng ta hai option /include và /exclude để lựa chọn việc thực thi/không thực thi các phương thức kiểm thử theo Category.

nunit-console [tập tin dll/csproj/nunit] /include:[tên category]
nunit-console [tập tin dll/csproj/nunit] /exclude:[tên category]

Thiết lập quá trình thực thi

Trong phần này, NUnit cho chúng ta một số lựa chọn: /framework; /process; /domain; /apartment  /timeout. Ngoài lựa chọn /timeout với ý nghĩa thiết lập thời gian tối đa cho từng phương thức kiểm thử – với đơn vị là mili-giây, mình cảm thấy những lựa chọn khác không có nhiều ý nghĩa lắm. Đơn giản là vì chúng ta thực thi kiểm thử tự động trên từng máy khác nhau, và lúc đó, những giá trị như framework, domain hay apartment sẽ đi theo cấu hình từng máy, việc tái thiết lập trở nên không cần thiết.

Thiết lập đầu ra (output)

Về mặc định, sau khi thực thi chương trình Nunit-Console, một tập tin TestResult.xml sẽ được tạo ra và lưu kết quả của lần thực thi đó. Để có thể tạo tập tin kết quả này ở đúng thư mục và đúng tên theo chúng ta, /result được sử dụng.

nunit-console [tập tin dll/csproj/nunit] /result:[tên tập tin kết quả]

Trường hợp, nếu chúng ta không muốn có tập tin kết quả trả về, chúng ta có thể thiết lập /noresult.

Các lựa chọn khác

Chúng ta có một số lựa chọn đặc biệt khác như:

  • /out: lựa chọn này sẽ không ghi dữ liệu của Console.Writeline ra màn hình Console mà sẽ tạo một tập tin riêng để chứa những thông tin này.
  • /err: lựa chọn này sẽ ghi thông tin của lỗi trong quá trình thực thi ra tập tin.
  • /wait: lựa chọn này sẽ yêu cầu người dùng tác động trước khi kết thúc quá trình thực thi. Điều này có ý nghĩa khi chúng ta thực thi Nunit-Console từ tập tin batch, và muốn xem dữ liệu trước khi cửa sổ Console được đóng lại.
  • /help hay /?: lựa chọn này được dùng để xem cấu trúc và ý nghĩa của các lựa chọn mà NUnit cung cấp.

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

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

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

System Design Cơ Bản – Consistent Hashing

Consitent Hashing

Bài viết được sự cho phép của tác giả Edward Thiên Hoàng

Như đã nhắc đến rất nhiều lần bên trên thì Distributed Hash Table (DHT — Bảng băm phân tán) là một thành phần cơ bản trong những distributed scalable systems (hệ thống phân tán có khả năng mở rộng). Một Hash Table cần một cặp , và một hàm “hash” để map với vị trí mà  của nó được lưu trữ.

 

index = hash_function(key)

Giả sử ta có thiết kế một distributed caching system (Redis cache chẳng hạn). Chúng ta có “n” cache servers, thì hàm băm (hash function) để map key với vị trí của Cach server nó làm ở đâu sẽ là . Nó rất đơn giản và dễ sử dụng, tuy nhiên nó có hai nhược điểm chính là:

  Chuyện mấy con Consumer
  Code game rắn săn mồi trên console bằng C++
  1. Nó rất khó horizontally scalable (phân tán theo chiều ngang). Bởi vì mỗi lần một cache server mới được thêm vào LB, mọi mapping trước khia giữa key với value nó được lưu trữ ở đâu sẽ sai toét hết. Hiện tượng cache miss sẽ sẩy ra tràn lan và rất mất thời gian và khó khăn để cập nhật tất cả các mapping key-value, với một hệ thống lớn với số lượng caching data khổng lồ đây là một điểm ác mộng với những người quản lý dữ liệu.
  2. Nó có thể không đáp ứng được việc cân bằng tải (Load Balanced), bởi vì ta không thể chắc chắn rằng việc hash và mapping như vậy những data được lưu trữ ở các server khác nhau có độ truy cập có cân bằng nhau không? Rất có thể những data ít được truy cập có thể tập chung vào một vài server và vài server còn lại lại chứa những “hot key”, dẫn tới tình trang một vài server thì hoạt động hết công xuất, một vài server thì lại quá nhàn rỗi ngồi chơi không 😙.

Với những vấn đề như vậy thì Consistent Hashing là một giải pháp rất tốt để cải tiến việc chia server với các caching system.

CONSISTENT HASHING GIẢI QUYẾT VẤN ĐỀ NÀY NHƯ THẾ NÀO?

Consistent Hashing là một chiến thuật hiệu quả cho việc phân chia distributed caching systems và DHT. Nó cho phép việc thêm hay xóa các node trên một cụm server (cluster) mà ít gây ra sự xáo trộn dữ liệu, do đó nó các hệ thống caching system sẽ dễ dàng scale-up hay scale down.

Trong Consistent Hashing, khi bảng băm (hash table) thay đổi kích thước (ví dụ thêm một node và cluster), chỉ có “k/n” keys cần re-map với “k” là tổng số keys có trong hệ thống, và “n” là tổng số server. Có nghĩa là khi thay đổi kích thước của cluster thì có duy nhất keys trên một server cần phải re-map. Và khi một node bị xóa khỏi cluster, thì các data của node đó sẽ được di chuyển và chia sẻ với các node khác, và cũng tương tự khi một node được thêm vào cluster thì nó sẽ lấy tự động dữ liệu từ một vài node khác để chia sẻ tài nguyên.

CONSISTENT HASHING HOẠT ĐỘNG NHƯ THẾ NÀO?

Vậy làm thế nào để Consistent Hashing làm được những điều trên thì các Node trên cluster sẽ được lưu trữ dưới dạng vòng tròn bằng cách sử dụng hash function trong Consisten Hashing sẽ hash các key thành một một số nguyên (Integer) nằm trong một khoảng nào đó và các số nguyên đó sẽ được đặt trên một vòng tròn sao cho mỗi điểm trên vòng tròn sẽ tương ứng với một số nguyên trên dãy số nguyên đó.

Tóm lại các bước để Consistent Hashing băm dữ liệu như sau:

  1. Tiến hành hash các danh sách node trong cluster server thành một số nguyên trong một khoảng số được định nghĩa trước. Khoảng số này tùy vào người thiết kế hệ thống cân nhắc dựa trên số lượng Server tối đa mà hệ thống sẵn sàng scale up.
  2. Sau khi đã có danh sách mapping giữa các node, ta sẽ tiến hành mapping  của data tới các node bằng cách.
  • Hash giá trị của key thành một số nguyên (integer).
  • Di chuyển nó liên tục trong vòng tròn số nguyên trong khoảng đã tạo ở trên theo chiều kim đồng hồ cho tới khi giá trị integer đó bằng với giá trị hash key của một Node đầu tiên nó gặp. Tiến hành ghi dữ liệu của dữ liệu đó vào Node vừa gặp.

10-1

Mô hình vòng tròn trong Consistent Hashing

Do đó khi tiến hành thêm một Node vào Cluster Server thì dữ liệu Node gần nó nhất theo chiều kim đồng hồ sẽ được chia sẻ với Node mới thêm vào.

10-2

Mô hình Consistent Hashing với trường hợp thêm mới Node

Tương tự như việc xóa một Node trên Cluster, khi cache miss sẩy ra, dữ liệu sẽ được di chuyển, lưu và lấy từ Node kế cận nhất với Node đã xóa theo chiều kim đồng hồ

10-3

Mô hình Consistent Hashing với trường hợp xóa mới một Node

Như vậy, Consistent Hashing đã giải quyết được vấn đề xáo trộn data cache khi scale hệ thống theo chiều ngang, đảm bảo sự xáo trộn cache chỉ xảy ra với một server.

Vấn đề về phân phối đều data trên từng Node.
Bên trên chúng ta cũng đã đề cập về vấn đề Load Balancing, với dữ liệu thật thì khả năng nhiều data key đều được hash vào một dãy giá trị lưu trên một Node nào đó, khiến Node đó trở thành điểm nóng (hot spot) so với các server còn lại. Dẫn đến việc lệch cân bằng tải và rủi ro nếu node hot spot gặp sự cố, gần như toàn bộ cache sẽ bị mất, dẫn tới cache miss hàng loạt.

Để giải quyết vấn đề này, chúng ta sẽ thực hiện hash và thêm nhiều các Node ảo (virtual node) vào vòng tròn. Và thay vì việc chỉ mapping mỗi Node vào một điểm trên vòng tròn, mỗi node ảo tượng trưng cho một dãy giá trị mà một Node thật đảm nhiệm. Có nghĩa là mỗi Node thật sẽ lưu trữ dữ liệu được ánh xạ trên nhiều Virtual Node. Điều này sẽ làm cho việc phân phối key sẽ cân bằng hơn, nó giống với việc tạo ra nhiều Node con hơn cho hash function trong Consistent Hashing băm “nhuyễn” hơn 😃

Ví dụ ta có 3 Node trên Cluster, ta sẽ tạo thêm 3 virtual Node tương ứng, lúc này vòng tròn sẽ chia thành 6 điểm như trên hình vẽ. Mỗi Virtual Node sẽ ánh xạ tới các Node thật, như trong hình là Virutal Node mầu đỏ 🔴 sẽ ảnh xạ tới Real Node mầu đỏ 🔴, Virutal Node mầu xanh nước biển 🔵 sẽ ánh xạ tới Real Node mầu xanh nước biển 🔵 , tương tự với Virtual Nod mầu xanh nhạt. Do vậy với Node 🔴 nó sẽ chứa dữ liệu của khoảng 1 và 4 Node 🔵 sẽ chứa dữ liệu của 2 và 5, tương tự Node còn lại sẽ chứa dữ liệu của 0 và 6.

10-4

Virtual Node trên Consistent Hashing

Consistent Hashing được ứng dụng rất rộng rãi nổi bật nhất là DynamoDB và Cassandra đã ứng dụng nó vào việc replicate dữ liệu giữa các Server Node của nó.

Theo medium

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

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

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

Cẩm nang tri thức dành cho sinh viên ngành IT

ngành IT

Hậu Codvid – 19, nhiều thách thức về tuyển dụng nhân sự ngành IT lại gia tăng. Điều này đã làm ảnh hưởng không nhỏ đến cơ hội nghề nghiệp của nhiều ứng viên, đặc biệt là các sinh viên mới ra trường. Vậy câu hỏi đặt ra làm thế nào để giảm sức ép cạnh tranh hiện tại?

Các bạn sinh viên ngành IT cần trang bị những kỹ năng gì? Xóa tan đi nỗi lo về việc quá áp lực để tìm kiếm một công việc tốt đồng thời, nhận ra được đâu là những gì bản thân cần rèn luyện chính là điều mà các bạn sinh viên hiện tại nên cần ghi nhớ.

Cùng TopDev phân tích theo dõi xem đâu là những yếu tố có mặt trong cẩm nang tri thức nhé!

Các yếu tố trong cẩm nang tri thức

Am hiểu kiến thức chuyên ngành IT – Giá trị cốt lõi chinh phục mọi thành công

Không chỉ riêng ngành IT, dù bất kỳ ngành nghề nào như freelancer it thì thì việc nắm chắc các kiến thức chuyên ngành đều rất quan trọng. Kết quả chuyên ngành là cơ sở phản ánh năng lực cảm thụ, vận dụng tính chuyên môn vào thực tế. Các kiến thức nền tảng mà bạn cần nắm bắt như:ngôn ngữ lập trình, tư duy lập trình, lập trình hướng đối tượng, cấu trúc dữ liệu & giải thuật,…

ngành IT

Một điều bạn cần lưu tâm là: Bạn phải nắm bắt chắc chắn nền tảng kiến thức trước khi “xông pha” đi tìm việc.

Ngoài ra, năng lực chuyên môn cũng thể hiện mức độ phù hợp của bạn với công việc. Kiến thức là vô tận. Dù bạn giỏi, sự học vẫn cần được duy trì. Chính sự nỗ lực tự trau dồi các kiến thức sẽ giúp bạn phát triển năng lực một cách nhanh nhất.

Thế đâu là cách giúp bạn định hình việc học tập tốt hơn? Hãy xác định cho bản thân một con đường phát triển riêng. Từ định hướng đó, bạn sẽ không bị xao nhãng, lệch ra khỏi trục định hướng về tương lai. Khi đã xác định được hướng đi bạn yêu thích, việc tự thiết lập một lộ trình học tập phù hợp sẽ dễ dàng hơn. Điều quan trọng là nhận ra đâu là cái bạn đam mê. Hãy suy nghĩ thật thận trọng!

Backend, frontend,…hay freelancer it có thể là một mảng nào đó tùy thuộc vào bạn. Khi đã có lựa chọn, hãy bắt đầu triển khai học tập. 

Nắm bắt các xu hướng công nghệ

Không thể phủ nhận, công nghệ đang có sự phát triển rất mạnh mẽ. Dường như mọi khía cạnh trong công nghệ đều được khai thác và nâng cấp nhanh chóng. Những bước lột xác cho thấy sự thăng hạng về công nghệ phải kể đến như: AI – Trí tuệ nhân tạo, Blockchain, công nghệ – IT kết hợp với con người nhân sự, các chiến lược về công nghệ,…

  HR & IT - "Cuộc chơi" đầy hoàn hảo cho việc thu hút và giữ chân nhân tài
  Phân tích con người - Chiến lược quan trọng trong ngành Nhân sự năm 2023

ngành IT

Thế nên, việc nắm bắt các xu hướng công nghệ nổi bật chính là yếu tố quan trọng tiếp theo. Các bạn sinh viên mới ra trường có thể chưa đủ “chín” để là người tạo ra xu hướng. Đơn giản, vì điều các bạn thiếu chính là sự trải nghiệm. Tất nhiên, không thể đánh đồng và quy ước thực tế ấy ra bội số chung. Song, thực tế cho thấy, các bạn vẫn cần thời gian để hoàn thiện mình nhiều hơn.

Có thể các bạn không là người tạo ra xu hướng. Nhưng khả dĩ, các bạn hoàn toàn có thể trở thành người dẫn đầu xu hướng. Mấu chốt chính là việc các bạn có nắm bắt được các xu hướng công nghệ đang thịnh hành hay không? 

Cùng TopDev điểm qua một số xu hướng công nghệ nổi bật nhất nhé:

– Trí tuệ nhân tạo – AI

– Học máy – Machine Learning/ Học tăng cường – Reinforcement Learning

– Thực tế ảo – VR và thực tế tăng cường – AR

– Điện toán biên – Edge Computing

– Tự động hóa quy trình bằng Robot – Robotic Process Automation (RPA)

– Blockchain

– An ninh mạng – Cybersecurity

Con người hội nhập 

Sức cạnh tranh hiện tại trong ngành IT hay freelancer it rất khắc nghiệt. Nếu chỉ với tiếng Anh, bạn khó có thể tiến xa. Vì đơn giản, bạn không phải là nhân tố nổi trội duy nhất trên sàn đấu IT này.

ngành IT

Chúng ta cần chấp nhận rằng tiếng Anh không còn là ưu thế nữa. Nó là điều bắt buộc các bạn phải sở hữu. Công việc ngành lập trình đòi hỏi bạn sẽ thực hiện các dự án lớn nhỏ khác nhau. Việc đọc và tra cứu các tài liệu với đa dạng các ngôn ngữ khác nhau là chuyện không mấy xa lạ.

Do vậy, ngoài kỹ năng chuyên môn, sự nỗ lực, khả năng đa ngôn ngữ là một lợi thế quan trọng. Hãy trau dồi thêm các ngôn ngữ khác như: tiếng Trung, tiếng Nhật, tiếng Hàn,…  để gia tăng cơ hội. Bạn sẽ tự tin hơn và thỏa sức làm việc với các khách hàng đa quốc gia.

Xem thêm: 6 chiến lược tuyển dụng IT giúp chinh phục ứng viên tài năng

Chính các nhà tuyển dụng nhân sự IT, freelancer it cũng chú trọng đến vấn đề này. Họ luôn xem xét thêm về tiêu chí “đối ngoại đa ngôn ngữ” bên cạnh kỹ năng chuyên môn. Điều này hoàn toàn dể hiểu. Việc biết nhiều ngôn ngữ sẽ mang lại nhiều cơ hội hợp tác với các khách hàng. Đồng thời, chính bản thân ứng viên cũng được học hỏi thêm từ các đối tác nước ngoài về: trình độ, tác phong làm việc chuyên nghiệp,… 

Những điều gì bạn còn thiếu?

Đặc điểm chung của nhiều sinh viên mới ra trường chính là việc thiếu kỹ năng mềm. Có thể chuyên môn của họ rất giỏi. Thế nhưng, kỹ năng mềm của họ chỉ đạt mức trung bình. Đồng thời, việc am hiểu nhu cầu của nhà tuyển dụng lại rất quan trọng. Bạn chưa thể đi ứng tuyển nếu chưa biết nhà tuyển dụng cần gì.

Hạn chế về kỹ năng mềm

Nếu là một sinh viên ngành IT, bạn càng phải rèn luyện kỹ năng mềm. Lý thuyết đôi khi chưa thể phát huy hết giá trị của nó nếu mỗi cá nhân không tự tạo cơ hội để lý thuyết được áp dụng. 

Xem thêm: Top 5 website giúp thiết kế CV chuẩn format, đủ nội dung

Một số kỹ năng mà các bạn sinh viên cần phải rèn luyện là: tính chủ động, tư duy độc lập, tiếp thu và phản hồi, tư duy phản biện; kỹ năng làm việc nhóm, kỹ năng giao tiếp – thuyết trình, kỹ năng viết CV, kỹ năng phân tích và giải quyết vấn đề,…

ngành IT

Tăng hiệu quả ứng tuyển bằng cách tạo CV Online hiệu quả trên TopDev

Hãy tận dụng các cơ hội để rèn luyện và phát huy kỹ năng mềm. Đừng bỏ lỡ những cơ hội trải nghiệm thực tế. Vì nó sẽ giúp bạn đánh giá được năng lực hiện tại. Đồng thời, giúp bạn ghi nhận các phản hồi từ mọi người. Các dự án nhỏ, những chương trình cộng tác, thực tập sinh,… là cơ hội tốt để bạn nâng cao level của bản thân.

Lưu ý, bạn vẫn phải biết cách cân bằng giữa việc học và tham gia trải nghiệm thực tế. Tất nhiên, mọi nhà tuyển dụng đều thích những ứng viên luôn chủ động trong công việc. Đừng để chậm nhịp, mỗi cơ hội đều đáng giá, cố lên!

Nhà tuyển dụng đang cần gì?

Bạn có mọi thứ và vì thế, bạn có thừa sự tự tin để ứng tuyển. Tuy nhiên, bạn cần xác định rõ bản thân đã hiểu về nhu cầu của nhà tuyển dụng hay chưa.

ngành IT

Công nghệ có thể được nâng cấp, kiến thức ngày một được đổi mới, nhiều ứng viên cùng ứng tuyển tạo ra một sức ép cạnh tranh lớn hơn. Nếu bạn cứ giữ tâm thế mình đã hoàn thiện, bạn khó có thể thành công. Điều quan trọng là bạn phải luôn cập nhật mình trong từng khía cạnh nhỏ. Xác định đối tượng cùng những đặc trưng mà họ hướng đến. Đồng thời, rèn luyện để phát huy các thế mạnh tương ứng về kiến thức, kỹ năng, ngoại ngữ,… sao cho phù hợp với vị trí ứng tuyển. 

Lời kết

Hành trình nghề nghiệp của bạn chỉ thật sự bắt đầu khi bạn kết thúc chặng đường sinh viên. Đừng ngại dấn thân! Đừng e ngại nỗi lo thất nghiệp! TopDev hy vọng với những yếu tố vừa kể trên phần nào sẽ giúp các bạn sinh viên ngành IT, freelancer it định hình được bản thân mình cần gì, đang thiếu những gì. Từ đó, các bạn sẽ lập được kế hoạch rèn luyện để hoàn thiện và phát triển mình một cách tốt nhất.

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

Xem thêm Top việc làm Fresher sinh viên HOT trên TopDev

Vantix – Bệ phóng lý tưởng cho các tài năng công nghệ vươn tầm sự nghiệp

Vantix - Bệ phóng lý tưởng cho các tài năng công nghệ vươn tầm sự nghiệp

Không ngừng tiên phong đón đầu xu hướng công nghệ mới, Công ty Cổ phần Giải pháp và Dịch vụ Công nghệ Vantix đã tạo nên bước đột phá cho ngành công nghệ Việt, mang đến những giải pháp và dịch vụ quản lý Dữ liệu & AI hiệu quả. Từ đó mở ra hướng đi mới, một “mảnh đất” màu mỡ cho các nhân tài công nghệ phát triển sự nghiệp và tỏa sáng tài năng.

Vantix - Bệ phóng lý tưởng cho các tài năng công nghệ vươn tầm sự nghiệp

Vantix – Khác biệt để dẫn đầu

Chính thức góp mặt vào đường đua công nghệ từ tháng 2/2019, Vantix Technology Solutions and Services (Vantix Inc) đã cho thấy sức mạnh của mình, thể hiện vị thế của một trong những công ty thuộc khối Công nghệ của Vingroup – Tập đoàn kinh tế tư nhân đa ngành lớn hàng đầu châu Á.

Hiện thực hóa mục tiêu sử dụng hiệu quả các giải pháp Trí tuệ nhân tạo & Dữ liệu trong việc nâng cao năng suất lao động, Vantix Inc trở thành đơn vị ứng dụng các công nghệ mới nhất của AI (Trí tuệ nhân tạo) nhằm tạo ra lợi thế cạnh tranh cho các doanh nghiệp trong nước và quốc tế.

Với giải pháp VinHR và vòng đeo tay vBand, Vantix Inc bước đầu phá vỡ những giới hạn đồng thời khẳng định được sức mạnh của công nghệ, đưa Vingroup trở thành một trong những đơn vị đầu tiên trên thế giới cung cấp giải pháp tối ưu hóa năng suất lao động thông qua thiết bị IoT cá nhân và AI.

Chưa dừng lại ở đó, Vantix với tham vọng lớn lao của “kẻ dẫn đầu”, hứa hẹn đem đến thách thức lớn hơn cho giới công nghệ trên toàn thế giới với những bài toán chưa có lời đáp, mở ra tương lai đầy khởi sắc ghi dấu một sự bùng nổ của công nghệ với các dự án có tính tự động hóa cao.  

Vantix – Điểm đến lý tưởng dành cho các tài năng công nghệ

Hướng đến việc tạo sự thoải mái cho con người và tối đa hóa năng suất lao động, Vantix không ngừng nghiên cứu, đưa những ý tưởng, giải pháp công nghệ đến gần hơn với cuộc sống, mang lại giá trị thực cho doanh nghiệp. 

Cùng Vantix bứt phá mọi giới hạn và thách thức chính là đội ngũ các tài năng đến từ Microsoft, IBM, Facebook, Ebay, Intel với năng lực chuyên môn cao về mảng AI, Machine Learning, Data. Không dừng lại ở đó, sức hút từ Vantix trở nên mạnh mẽ hơn khi ngày càng có thêm những “mảnh ghép” mới, dám khác biệt và sẵn sàng cống hiến sức lực và trí lực nhằm chinh phục mục tiêu phía trước.

Tại Vantix, tiềm năng cá nhân của mỗi thành viên luôn được khai phá để phát triển với sự hỗ trợ từ những nhà lãnh đạo tuyệt vời. Tin tưởng vào sức mạnh vô hạn của công nghệ cũng như khả năng kỳ diệu của trí tuệ con người, Vantix mang đến môi trường sáng tạo cùng sự khác biệt, hướng tới sự thoải mái cho con người và tối ưu hiệu quả lao động. 

Đến với Vantix, mỗi thành viên là một phần tử quan trọng, là cá thể độc lập dám nghĩ, dám làm, dám thay đổi và dám bứt phá để có được những bước nhảy vọt cho sự nghiệp. Và nếu bạn tự tin với vốn kiến thức, kinh nghiệm cùng sự nhiệt huyết và niềm đam mê với công nghệ mới, Vantix luôn có cơ hội cho bạn phát triển sự nghiệp của bản thân.

Vantix - Bệ phóng lý tưởng cho các tài năng công nghệ vươn tầm sự nghiệp

Chiêu mộ nhân tài, mang đến cơ hội phát triển tài năng

Phá vỡ giới hạn với những sản phẩm sáng tạo, Vantix tìm kiếm những nhân tố tài năng để cùng góp sức. 

Cơ hội đặc biệt gõ cửa các nhân tài công nghệ Senior C/C++ EngineerProject Manager Technical với loạt đãi ngộ phong phú và cơ hội phát triển sự nghiệp cực hấp dẫn:

  • Thu nhập cạnh tranh với lương tháng 13 và thưởng hàng năm xứng đáng theo chính sách của Tập đoàn;
  • Từng bước phát triển sự nghiệp, tỏa sáng tài năng trong môi trường quốc tế chuyên nghiệp, đầy nhiệt huyết và sáng tạo;
  • Được làm việc, tiếp xúc với những thiết bị, xu hướng công nghệ hiện đại nhất hiện nay với cơ hội học hỏi các kiến thức chuyên sâu về AI & Dữ liệu;
  • Hưởng trọn đặc quyền khi sử dụng các dịch vụ tại Vingroup: Vinmec, Vinhomes, Vinschool, VinFast, Vinsmart…
  • Cùng nhiều điều thú vị đang chờ các tài năng công nghệ trực tiếp trải nghiệm.

Bạn đã sẵn sàng cho bước ngoặt mới của sự nghiệp?

Apply ngay hôm nay và bắt đầu cuộc hành trình cùng Vantix tạo nên sự khác biệt.

Bàn Về Cái Sự Nhảy Việc!

Bàn về sự nhảy việc

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

NGƯỜI HAY NHẢY VIỆC THÌ CHẾ NHẠO NGƯỜI LÀM LÂU NĂM 1 CHỖ!

NGƯỜI LÀM LÂU DÀI 1 CHỖ THÌ PHÊ PHÁN NGƯỜI HAY NHẢY VIỆC!

  10 kinh nghiệm khi làm việc với các dự án lớn viết bằng Vue.js
  10 Kỹ năng quan trọng cần có của Front-end để tìm công việc dễ dàng hơn

Thực trạng đúng là như vậy. bạn có thể thấy nhóm bạn:

“- Mày chuyển việc đi, tao thấy chỗ này chỗ kia lương cao gấp đôi lương mày á!

– Ối giời, mày lại chuyển việc rồi hả. Mày không mệt à? Thôi cứ như tao ở một chỗ cho lành”

Bàn Về Cái Sự Nhảy Việc!

Phải công nhận là, thị trường lao động, công việc và bản thân chúng ta, đều thay đổi, và phải thay đổi.

Không thể có chuyện bao năm bao tháng không biến chuyển gì.

Nên sẽ có sự thay đổi càng phù hợp, hoặc thay đổi nên dần không hợp. Thay đổi nên cần hướng đi khác. Hoặc không thay đổi kịp bị đào thải…

Đó cũng là sự lựa chọn của mỗi người. Và tôi khẳng định, nó sẽ có sự phù hợp riêng với từng cá nhân, từng thời điểm, từng hoàn cảnh, vì chúng ta hoàn toàn không giống nhau.

Tôi đánh giá cao về các bạn ứng viên nói: “Vì kế hoạch nghề nghiệp của tôi, tôi sẽ làm việc ở đây đúng trong 2 năm, và tôi đảm bảo, tôi sẽ toàn tâm toàn ý cống hiến cho công ty bằng năng lực cao nhất của tôi.”

Hoặc 1 năm, hoặc 5 năm… Theo định hướng của bạn, chứ không phải là “Tôi muốn tìm một nơi làm việc ổn định, để gắn bó lâu dài…”. Chẳng có gì là ổn định cả, Mãi mãi lại bằng 2 năm 🙂))

Nhưng khéo 2 tháng sau có cả tá lý do để nghỉ việc, hoặc cố lắm thì được qua tết lấy thưởng rồi bye 🙂))

————-

Nếu bạn muốn nhảy việc, thì bạn cứ tìm cơ hội mới, nhưng đừng vì ngấp nghé cơ hội mới -> chán công việc hiện tại -> hiệu suất giảm -> lại chán công việc hơn -> lại tìm công việc mới -> lại tiếp diễn. Vậy là không ổn, bạn đang tự phá sự nghiệp của mình thôi.

Có lẽ bạn nên thôi ngó nghiêng và vùi đầu vào công việc thì tốt hơn.

Nếu bạn làm lâu năm, công việc mãi mãi như một, cũng chẳng thăng tiến chút nào, lương thì chỉ tăng vừa bằng lạm phát, hoặc, tăng lương chẳng phải do bạn mang về doanh thu, mà do những người khác làm công ty phát triển. Thì bạn hãy tích cực định vị lại bản thân và cập nhật thị trường đi, xem xét đi phỏng vấn job khác xem năng lực hiện tại của bản thân như thế nào, chứ bạn sắp bị đào thải mất thôi.

Thêm nữa, nhiều trường hợp, họ vẫn có một công việc fulltime bình thường, ngoài ra thì họ có công việc tay trái nữa, hoặc họ dành thời gian cho công việc/ sự nghiệp/ thú vui…nào đó.

Nói chung, chúng ta cần tự hoạch định và quản lý bản thân mình và biết mình ở đâu.

Via: Vân D

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

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

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

Callback trong PHP là gì?

Callback trong PHP là gì?

Bài viết được sự cho phép của tác giả Kien Dang Chung

Callback là gì?

Callback là khái niệm một hàm được truyền vào một hàm khác như một tham số để nó có thể được thực hiện trước hoặc sau một sự kiện hoặc một thay đổi trạng thái. Trong thực tế, callback nghĩa là gọi lại, xem xét một ví dụ sau, một người hỗ trợ sẽ thực hiện lấy các thông tin về lỗi của người dùng sau đó mới gọi lại (callback) cho khách hàng. Trong PHP, thực hiện callback là rất đơn giản. Chúng ta xem một ví dụ sau:

<?php
function sayHello($callback) {
    echo "Xin chào!</br>";
    // Các câu chuyện khác ở giữa xin chào và tạm biệt
    // ...
    $callback();
}
function sayGoodbye() {
    echo "Tạm biệt!";
}

sayHello('sayGoodbye');
// Kết quả
// Xin chào!
// ...
// Tạm biệt

Trên đây là một ví dụ rất đơn giản về callback trong PHP, hàm sayGoodbye được truyền vào hàm sayHello như một tham số. Cách thực hiện này rất hữu ích khi chúng ta muốn định nghĩa một hàm (sayGoodbye) được thực hiện khi một sự kiện xảy ra (sau các câu chuyện khác). Ví dụ trên đây khá dễ hiểu nhưng có một khía cạnh chưa được bàn đến là việc sử dụng kết quả của hàm gọi trong hàm được gọi. Ví dụ tiếp theo cho thấy hỗ trợ viên sau khi lấy thông tin về lỗi người dùng và sử dụng thông tin này để gọi lại cho khách hàng:

<?php
function sayHello($first_name, $last_name, $callback) {
    $full_name = $first_name . ' ' . $last_name;
    $callback($full_name);
}
function formatName($full_name) {
    echo '<h2 style="color:red;">Xin chào '. $full_name . '!<h2>';
}

sayHello('Nguyễn Văn', 'A', 'formatName');

Kết quả như sau:

Callback trong PHP là gì?

Ứng tuyển ngay các vị trí PHP tuyển dụng mới nhất trên TopDev

Bản chất của callback(callback(full_name); là gọi đến một hàm được xây dựng sẵn trong PHP call_user_func, như vậy callback(callback(full_name); là tương đương với call_user_func(callback,callback,full_name); Sử dụng callback có thể có lỗi xảy ra nếu chúng ta callback đến một hàm chưa được định nghĩa, vậy chúng ta cần kiểm tra biến được truyền vào có phải là một hàm hay không bằng hàm is_callable():

<?php
function sayHello($first_name, $last_name, $callback) {
    $full_name = $first_name . ' ' . $last_name;
    if (is_callable($callback)) {
        call_user_func($callback, $full_name);
    }
}
function format($full_name) {
    echo '<h2 style="color:red;">Xin chào '. $full_name . '!<h2>';
}

sayHello('Nguyễn Văn', 'A', 'format');
  10 PHP Instagram Scripts & Widgets tốt nhất
  10 điều bạn cần biết về PHP7

Sử dụng callback ở đâu?

Callback thường được sử dụng trong những tình huống sau: – Khi ứng dụng cần thực hiện một hàm khác dựa trên ngữ cảnh hoặc trạng thái, hay nói một cách khác là muốn thực hiện một việc gì đó khi một sự kiện xảy ra.

  • Sử dụng với các hàm nặc danh (anonymous function) hoặc với Closure.
  • Lập trình đa luồng (multiple thread).

Ví dụ về lập xử lý đa luồng, chúng ta cần mở một file và ghi vào file một cái gì đó, vì file này rất lớn nên việc mở file có thể mất một chút thời gian. Nếu như viết theo cách cũ:

fileObject = open(file)
// Cần phải chờ file được mở thì mới ghi vào file được, có thể mất 5 phút chẳng hạn.
fileObject.write("We are writing to the file.")
// Tiếp theo mới làm được những việc khác
doSomething();

Sử dụng callback, chúng ta có thể thực hiện được những việc khác luôn

fileObject = open(file, writeToFile)
// Không cần phải chờ file mở và ghi vào file, chúng ta có thể thực hiện việc khác luôn.
doSomething();

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

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

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Sử dụng bảng quyết định trong kiểm thử phần mềm

Sử dụng bảng quyết định trong kiểm thử phần mềm

Bài viết được sự cho phép của vntesters.com

Trong các kỹ thuật viết kịch bản kiểm thử, đối với các trường dữ liệu đơn như textbox, chúng ta thường sử dụng các phương pháp như lớp tương đương (Equivalence partitioning) hay phương pháp phân tích giá trị biên (Boundary value analysis). Đối với kiểm thử hành vi của hệ thống với nhiều trường dữ liệu, bảng quyết định (Decision table) sẽ giúp chúng ta phân loại và định hình được kịch bản kiểm thử một cách chính xác và rõ ràng hơn.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  Các trường hợp kiểm thử OTP

Về cơ bản, bảng quyết định sử dụng mô hình luận lý phức tạp để người dùng dễ dàng thấy các kết hợp có thể có của các điều kiện đang xem xét và các hành động tương ứng với tập hợp giá trị của chuỗi điều kiện.

Một ví dụ cơ bản nhất cho bảng quyết định là hệ thống máy rút tiền tự động ATM: Để có thể rút được tiền từ máy ATM, người dùng cần một trong hai điều kiện: tiền trong tài khoản vẫn còn và lớn hơn số tiền muốn rút (Đối với thẻ debit) hoặc là, người dùng được cấp cho một khoản tín dụng từ trước (Đối với thẻ Credit). Diễn đạt bằng lời như thế này, đôi khi dễ làm chúng ta nhầm lẫn về các điều kiện thực tế, chưa kể đến từ “và” và “hoặc”. Khi đưa các điều kiện này vào bảng quyết định, chúng ta sẽ thấy mọi thứ rõ ràng hơn nhiều:

Điều kiện Trường hợp 1 Trường hợp 2 Trường 3
Số tiền trong tài khoản lớn hơn số tiền định rút Đúng (T) Sai (F) Sai (F)
Đã được cấp tín dụng Đúng (T) Sai (F)
Hành động của hệ thống
Cho rút Có (T) Có (T) Không (F)

Thông thường, bảng quyết định sử dụng giá trị luận lý để diễn đạt các điều kiện và hành động của hệ thống. Đối với “đúng/sai” hay “true/false”, chúng ta sẽ dễ dàng ứng dụng các phép toán luận lý như “”/”hoặc” hơn.

Việc liệt kê các điều kiện và các giá trị có thể có của từng điều kiện, chúng ta sẽ có thể đảm bảo toàn bộ kết hợp của các điều kiện được xuất hiện trong bảng quyết định, từ đó chúng ta sẽ đảm bảo sẽ không bỏ qua bất kỳ một kịch bản kiểm thử nào. Hơn nữa, với bảng quyết định, chúng ta có thể phát hiện nhanh chóng những yêu cầu vô lý, qua đó giúp chúng ta tiết kiệm thời gian và công sức thực thi những kịch bản kiểm thử vô nghĩa.

Mặt khác, chúng ta có thể thấy rằng, bảng quyết định không chỉ tốt cho kỹ sư kiểm thử, nó còn có tác dụng cực lớn cho tất cả mọi thành viên của nhóm phát triển phần mềm, từ chủ của sản phẩm (product owner) khi đưa ra ý tưởng, đến các lập trình viên để họ tạo dựng và phát triển hệ thống.

Các bước để tạo một bảng quyết định

1. Phân tích các điều kiện và hành động của hệ thống

Trở lại ví dụ ở trên về máy ATM, chúng ta có thể thấy có hai điều kiện xác định:

  • Số tiền trong tài khoản lớn hơn số tiền định rút
  • Được cấp tín dụng

Và chỉ có một hành động tương ứng của hệ thống: Được rút tiền hay không?

Điều kiện
Số tiền trong tài khoản lớn hơn số tiền định rút
Đã được cấp tín dụng
Hành động của hệ thống
Cho rút

2. Thêm các cột trường hợp giá trị của điều kiện

Đối với 2 điều kiện như trên, chúng ta sẽ có 4 sự kết hợp đúng/sai (2²)

Điều kiện Trường hợp 1 Trường hợp 2 Trường hợp 3 Trường hợp 4
Số tiền trong tài khoản lớn hơn số tiền định rút Đúng (T) Đúng (T) Sai (F) Sai (F)
Đã được cấp tín dụng Đúng (T) Sai (F) Đúng (T) Sai (F)
Hành động của hệ thống
Cho rút

3. Cố gắng giảm số lượng các cột điều kiện

Ở đây, chúng ta có thể thấy rằng, trường hợp 1 và trường hợp 2 là gần như nhau, khi số tiền trong tài khoản lớn hơn số tiền cần rút, chúng ta không cần quan tâm việc khách hàng có được cấp tín dụng hay không 🙂 Do đó, chúng ta có thể giảm bớt một trường hợp ở đây, chúng ta đánh dấu bằng “-“

Điều kiện Trường hợp 1 Trường hợp 2 Trường 3
Số tiền trong tài khoản lớn hơn số tiền định rút Đúng (T) Sai (F) Sai (F)
Đã được cấp tín dụng Đúng (T) Sai (F)
Hành động của hệ thống
Cho rút

4. Xác định hành động tương ứng của hệ thống

Dựa trên điều kiện, chúng ta sẽ có kết quả cuối cùng:

Điều kiện Trường hợp 1 Trường hợp 2 Trường 3
Số tiền trong tài khoản lớn hơn số tiền định rút Đúng (T) Sai (F) Sai (F)
Đã được cấp tín dụng Đúng (T) Sai (F)
Hành động của hệ thống
Cho rút Có (T) Có (T) Không (F)

5. Viết các kịch bản kiểm thử

Ở bước này, chúng ta bắt đầu viết chi tiết các bước và thiết lập dữ liệu kiểm thử cho kịch bản kiểm thử.


Một câu hỏi nhỏ thôi. Theo các bạn, việc chúng ta gom trường hợp 1 và 2 ở bước thứ 3 có tốt hay không? Có khả năng nào chúng ta sẽ bỏ lỡ một lỗi (bug) ở đây? Và trong trường hợp gom được, chúng ta nên chọn giá trị T hay F cho điều kiện thứ 2?

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

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

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

System Design Cơ Bản – Định lý Cap / Cap Theorem

định lý cap

Bài viết được sự cho phép của tác giả Edward Thien Hoang

Định lý CAP nói rằng một hệ thống phân tán (distributed system) không thể thỏa mãn cả ba yếu tố CAP đó là:

  • Consistency: tính nhất quán, tất cả các node phải có dữ liệu đồng nhất với nhau.
  • Availability: tính sẵn sàng hoạt động của các node. Hệ thống có thể vẫn hoạt động được khi một số node bị chết hoặc không sẵn sàng.
  • Partition Fault Tolerance: trạng thái hoạt động của hệ thống khi đường kết nối (mạng) giữa các node bị đứt, hay còn gọi là khả năng chịu lỗi của hệ thống. Hệ thống vẫn phải hoạt động bình thường cho dù các kết nối của các node trong hệ thống bị đứt gãy.
  Giải mã bí ẩn "system load" trên Linux
  System Admin là gì? Mô tả công việc vị trí System Administrator

System Design Cơ Bản - Định lý Cap / Cap Theorem
Định luật CAP

Chúng ta không thể thiết kế một hệ thống bao gồm cả ba tính CAP, bởi vì đảm bảo tính C (consistency) tất cả các cập nhật dữ liệu phải được thực hiện trên các node cùng một thời điểm. Nhưng nếu đường kết nối (mạng) giữa các node không được đảm bảo dẫn đến việc các node sẽ không được update dữ liệu cùng một thời điểm, điều này dẫn tới việc một vài node dữ liệu sẽ bị out-of-date do chưa được cập nhật dữ liệu từ đó vi phạm tính C (consistency). Và để đảm bảo đối phó với điều này ta sẽ ngừng phục vụ nhữg node bị out-of-date đó cho tới khi nó được update dữ liệu đầy đủ, nhưng việc này lại vi phạm tính A (availability) của hệ thống.

Thông thường, người ta thường đánh đổi yếu tố C để lấy hai yếu tố A và P. Khi đó họ sẽ thay thế Consistency thành eventually consistency (tính nhất quán có độ trễ), làm như thế hệ thống sẽ có hiệu năng tốt hơn

Theo medium

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

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

Xem thêm: Tìm việc làm designer hấp dẫn trên TopDev

Lưu tâm về 5 kiểu người khó hợp tác

hợp tác
hợp tác

Tính hợp tác trong công việc rất quan trọng, đặc biệt là đối với sự nghiệp thăng tiến của bạn. Vấn đề về tính cách, môi trường sống,… đã hình nên những cá tính – cái  tôi cá nhân khác nhau. Cùng TopDev điểm qua 5 kiểu người bạn mà bạn khó hợp tác qua bài viết sau!

Người thiếu đạo đức

Những cá nhân thiếu đạo đức như gian lận, tư duy luôn mưu tính thiệt hơn, không giữ uy tín, đam mê hào nhoáng – vật chất xa hoa,… Dẫu biết rằng mọi thị trường làm việc đều tồn tại những cạnh tranh với nhau. Tuy nhiên, nên cạnh tranh trên nguyên tắc công bằng – bình đẳng và đi lên từ năng lực cá nhân.

hợp tác
Giá trị nhân phẩm có một ý nghĩa quan trọng đến khả năng hợp tác.

Một freelancer IT cũng phải chịu nhiều thách thức, sức ép từ các đối thủ để có thể chứng tỏ sức ảnh hưởng và giá trị của mình.

Do vậy, bạn hãy cố gắng hết sức. Đừng làm bạn với những nhân vật đầy chiêu trò. Họ chỉ lợi dụng và ảnh hưởng tiêu cực đến bạn mà thôi.

Người ăn không nói có

Đây là dấu hiệu của những người thiếu cân thành, luôn sống hai mặt. Họ không quá thật lòng đối xử với một ai. Mặt khác họ luôn ngầm quan sát đối phương để nắm bắt những điểm mạnh, điểm yếu.

Xem thêm các việc làm về tuyển dụng Data Scientist 

Họ dễ dàng bia đặt những thứ không có thành có. Đây là kiểu người khó hợp tác vì luôn soi xét các khía cạnh khác nhau. Họ khó đưa ra những ý kiến đồng điệu trong một tập thể và chắc chắn rằng việc nói xấu người khác là một thói quen của họ.

Những cá nhân “chìm đắm” trong sự bi quan

Nếu có những người luôn tràn đầy năng lượng và lan tỏa nó đến mọi người. Ngược lại, sẽ có một kiểu người lại luôn chìm trong sự bi quan. Họ có dấu hiệu sợ hãi và nghĩ qua xa khi gặp một chuyện quá khó khăn nào đó.

hợp tác
Liệu bạn cò phải là kiểu người bi quan?

Chính sự bi quan đó sẽ khiến họ giảm đi những cơ hội thành đạt hơn. Họ sẽ khá e dè và kho nắm bắt tốt, khó bắt nhịp với quá trình phát triển của một nhóm. Do vậy, nếu tiếp xúc với những người này, bạn cần giúp họ cởi mở và thoải mái hơn.

Người “thắng kêu to”

Nói một cách dễ hiểu thì đây là kiểu người khoe khoang về thành tích. Họ luôn tự hào và cho rằng những gì mình làm được quá lớn lao.

Nhưng thực tế, việc bạn thành công sớm hay muộn là do bạn. Và nếu một giây phút nào đó bạn quá tự tin, người khác sẽ vượt mặt bạn. 

Freelancer IT không ngừng hoàn thiện kỹ năng, nếu quá tự tin thái quá, thất bại sẽ đến nhanh hơn với bạn.

Đây sẽ là kiểu người khó hợp tác bởi cái tọi của họ quá lớn. Họ luôn muốn phô bày các ý kiến, quan điểm của mình; thậm chí là áp đặt nó trong việc đi đến các quyết định chung. Tự tin đến mức không ai chấp nhận. Cái họ thiếu chính là sự khiêm nhường và nếu làm việc với họ, các bạn cần giúp họ nhận ra điều này.

Kiểu người sống thiếu trách nhiệm

Nếu là một người chăm chỉ và cầu toàn, bạn có thể một mình làm tất cả mọi thứ mà chẳng cần ai giúp. Nhưng trong một lúc mệt mỏi, bạn sẽ tự hỏi tại sao bạn phải làm cho người khác hưởng? Đối với kiểu người này, họ có thể sống bám vào người khác. Đôi khi họ nổi loạn, cá tính, bốc đồng,…

Xem thêm các việc làm NTQ Solution tuyển dụng

hợp tác
Người thiếu trách nhiệm sẽ khó có thể thành công.

Làm việc freelancer it thì không đúng giờ, trễ dealine, thiếu kỷ luật và không có tinh thần hợp tác. Do vậy, chất lượng và hiệu suất công việc bị giảm đi rõ rệt. Họ dần trở thành đối tượng không tạo được niềm tin từ đồng nghiệp. Việc họ cần thay đổi chính là sống có ý thức, tự giác tuân thủ các nguyên tắc. Đồng thời tự nhìn nhận để tạo ra các giá trị cống hiến tiếp theo trên hành trình sự nghiệp của mình.

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

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