Home Blog Page 132

Product Manager nên từ chối như thế nào để “được lòng người” nhất?

product manager là gì
Product Manager nên từ chối như thế nào để “được lòng người” nhất!

Tác giả: Maddy Kirsch

Cách từ chối hay ho cho Product Manager là gì?

Công việc của Product Manager là gì? Họ phải đưa ra được những lựa chọn tốt nhất. Vậy để đưa ra những lựa chọn tốt nhất, một Product Manager thường phải nói không với những đề xuất, ý tưởng, yêu cầu hay thậm chí là sự đòi hỏi từ các bên liên quan. Tuy nhiên, trên thực tế để được lòng mọi người cũng như công việc được suôn sẻ hơn, bạn nên biết cách từ chối khéo léo, hãy làm sao để đối phương có thể hiểu được vấn đề và tôn trọng quyết định của bạn.

product manager
Từ chối khéo léo giúp PM làm việc hiệu quả hơn

6 mẹo các Product Manager có thể sử dụng để nói “không”

Dành thời gian để thảo luận với các bên liên quan về yêu cầu của họ

Lý do cho việc này rất đơn giản, tất cả mọi người đều muốn được lắng nghe. Trong những khóa đào tạo trước khi nhận việc của các công ty lớn, như với chương trình KMS Technology tuyển dụng, Product Manager sẽ được hướng dẫn về cách lắng nghe những yêu cầu và khiếu nại của khách hàng, sau đó nói chuyện với họ như thế nào để họ hiểu và thông cảm với vấn đề hiện tại.

Khi một bên liên quan trong nội bộ công ty hoặc một khách hàng đến gặp bạn với yêu cầu thêm một tính năng hay một yêu cầu mà bạn không thể hỗ trợ, ít nhất là không phải ngay lập tức, bạn đừng vội vàng nói lời từ chối với họ.

Bạn không nên nói những câu nói đại loại như “Điều đó có vẻ không phải là ưu tiên cho sản phẩm này” hoặc, “Chúng tôi không có điều đó trong lộ trình.” Tại sao? Có hai nguyên do:

Đầu tiên, khi bạn từ chối mà không đưa ra những lý do thích hợp cho yêu cầu của bên liên quan, bạn sẽ khiến họ có cảm giác không hề được lắng nghe hay suy xét đến quan điểm của họ. Thay vào đó, Product Manager hãy dành thời gian ghi nhận yêu cầu, giải thích cho người đó hiểu rằng bạn hiểu tại sao họ muốn hoặc cần nó, tuy nhiên để thực hiện yêu cầu này ngay bây giờ thì rất khó.

Thứ hai, Product Manager có thể nói rằng “Đó không phải là ưu tiên của chúng tôi”. Trong trường hợp này dù bạn không giải thích quá nhiều về lý do từ chối nhưng ít ra vẫn tốt hơn so với việc bị từ chối mà không biết lý do là gì.

Xem thêm Một ngày làm việc của Google Product Manager

Vậy nên lời khuyên của tôi ở đây là, khi bạn phải từ chối ai đó, hãy chứng minh rằng bạn hiểu rõ công việc của mình và có lý do chính đáng để làm như vậy.

Tìm việc product manager mới nhất trên TopDev

Hiểu rõ nội dung công việc để đưa ra những lập luận hợp lý

Năng lực của Product Manager là gì? Để có năng lực làm việc xuất sắc, bạn cần dành nhiều thời gian để nghiên cứu và nghiền ngẫm về dự án của mình. Điều này bao gồm sự hiểu biết cặn kẽ về thị trường, nguồn nhân lực và năng lực nội bộ của công ty, bối cảnh cạnh tranh và các yếu tố cạnh tranh thị trường ảnh hưởng đến các quyết định chung như thế nào. Lúc này, bạn có thể đưa ra nhiều lý do thuyết phục hơn cho sự từ chối của mình.

product manager tuyển dụng
Hiểu rõ dự án giúp PM thuyết phục được đối phương

Do đó, trước tiên Product Manager nên dành thời gian thảo luận với người yêu cầu. Điều này sẽ chứng tỏ rằng bạn có thiện chí và muốn hiểu nhu cầu của họ, đánh giá cao gợi ý của họ. Sau đó, khi giải thích lý do tại sao bạn không thể đáp ứng yêu cầu, bạn có thể cung cấp bối cảnh lớn hơn – như các dự án cạnh tranh hoặc duy trì tính đơn giản và khả năng sử dụng của sản phẩm – mà người yêu cầu có thể không xem xét đến.

  Những mẹo hay để trở thành một Product Manager giỏi nhất

Nếu có thể, hãy chứng minh ý kiến này chỉ có giá trị nhất thời mà thôi

Giá trị nhất thời cần sự giải thích của Product Manager là gì? Giả sử trong trường hợp Product Manager phải từ chối yêu cầu từ nhóm bán hàng hoặc tiếp thị dù nó thật sự là quyết định hay ho. Hoặc một ý kiến mà bạn đơn giản là chưa từng gặp phải và có thể đáng được đưa vào kế hoạch sản phẩm nhưng trước tiên cần được kiểm tra. Câu trả lời của bạn lúc này có thể không phải là “không” – mà thay vào đó là “không phải lúc này”.

Ý tưởng thứ hai để các bên liên quan thấy rằng Product Manager dự định đánh giá các yêu cầu của họ và bạn không từ chối chúng, mà là đặt những yêu cầu này trong một diễn đàn cộng đồng, lý tưởng là một diễn đàn có thể truy cập được cho cả nhóm nội bộ của bạn cũng như khách hàng bên ngoài và thậm chí triển vọng, nơi bất kỳ bên quan tâm nào có thể bỏ phiếu hoặc bình luận về các ý tưởng mới.

Sự rõ ràng trong lựa chọn của Product Manager là gì?

Nhất là khi làm việc với các giám đốc trong công ty, bạn nên trình bày rõ ràng về lộ trình làm việc sản phẩm, bạn sẽ áp dụng những phương pháp nào, chủ đề, tính năng nào cho dự án này. Nếu bạn có thể chứng minh rõ ràng thông qua bản trình bày về cách làm việc của mình, rằng giai đoạn nước rút tiếp theo hoặc chu kỳ phát triển dài hạn hơn cần tập trung vào X, với lý do vững chắc đằng sau quyết định đó. Chắc chắn lúc này các bên liên quan sẽ thấy hợp lý và thông cảm với hành động rằng bạn không thể đáp ứng yêu cầu của họ với đề xuất Y.

Khả năng giao tiếp tốt của Product Manager là gì? Hãy hạn chế dùng chủ từ “tôi” khi nói không

Với tư cách là một Product Manager, bạn là người mà các bên liên quan sẽ đưa ra ý tưởng hoặc yêu cầu cho lộ trình phát triển sản phẩm. Nhưng điều đó không đồng nghĩa với việc bạn đang đưa ra quyết định mang tính cá nhân khi từ chối yêu cầu đó. Một cách hữu hiệu để nhấn mạnh điều này và giúp các bên liên quan hiểu rõ hơn về lý do tại sao bạn phải từ chối họ, đó là không đề cập đến bản thân bạn trong cuộc trò chuyện. Chẳng hạn thay vì nói “Tôi không nghĩ chúng ta nên tập trung vào ý kiến đó bây giờ”, bạn hãy nói rằng “Nghiên cứu của chúng tôi đã cho chúng tôi biết điều đó…”.

Tránh mắc các lỗi chủ quan để gây ấn tượng hơn

Cố gắng đừng dùng từ “không” dù bạn đang nói không

Đây là một cách rất hay để Product Manager vừa thể hiện sự tôn trọng với đối phương vừa có cơ hội tận dụng được những ý tưởng tốt cho thời điểm khác. Bạn có thể nói mình sẽ dành ý kiến này cho kế hoạch sắp tới,… Bạn không cam kết bất cứ điều gì, nhưng việc bạn ghi nhận ý kiến đó khiến người nói có cảm giác được tôn trọng và ý tưởng của họ dường như cũng có giá trị nào đó trong chiến lược sản phẩm của bạn.

Xem thêm Tui muốn làm Product Manager (PM)! Biết PM là gì chưa mà đòi?

Kết luận

Những mẹo nhỏ trên đây dù không phải là tất cả nhưng cũng sẽ phần nào quyết định được sự khéo léo và khả năng giao tiếp chuyên nghiệp của một Product Manager. Bạn vừa giữ nguyên được bản kế hoạch mà mình cho là tốt nhất, lại vừa không khiến người khác cảm thấy tức giận mà được tôn trọng hơn rất nhiều.

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

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

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

Cách tạo một portfolio ấn tượng cho Product Manager

product manager là gì
Cách tạo một portfolio ấn tượng cho Product Manager

Tác giả: Dr. Nancy Li

Portfolio của Product Manager là gì?

Hầu hết công việc của các Product Manager đều yêu cầu về kinh nghiệm làm quản lý sản phẩm, nhưng làm thế nào để thể hiện được những dự án mà trước đây bạn đã làm trong portfolio? Bài viết dưới đây chia sẻ với các bạn cách để tạo một portfolio thể hiện những kỹ năng bạn đã có trong các công việc trước và thông qua vòng phỏng vấn một cách trơn tru nhất.

Portfolio là một phần cực kỳ quan trọng vì nó thể hiện những sản phẩm bạn đã hoàn thành trong công việc trước đó của mình. Gần đây, có một sinh viên của tôi nhận được công việc Product Manager trong lĩnh vực thương mại điện tử. Có được kết quả này là nhờ trước đây cô ấy đã làm một portfolio rất ấn tượng để được tuyển vào vị trí này.

product manager
Portfolio của Product Manager được yêu cầu rất cao

Product Manager Portfolio cần thể hiện những gì?

Portfolio của Product Manager là gì? Những phần nào cần có trong portfolio?

Portfolio chứa danh sách các sản phẩm mà bạn đã làm việc trước đây, cách bạn sử dụng các phương pháp để quản lý sản phẩm. Từ đó nhà tuyển dụng phân tích xem bạn đã có kinh nghiệm làm việc ở vị trí này trước đây chưa, cũng như nắm được cách bạn làm việc, những thành phần quan trọng trong việc build một sản phẩm.

Tôi tin rằng ở đây có nhiều bạn nghĩ rằng một portfolio ấn tượng cần có thiết kế đẹp nhưng điều này không thật sự cần thiết với công việc Product Manager. Portfolio của một Product Manager cần tập trung vào kinh nghiệm làm việc với khách hàng, trải nghiệm khách hàng và các yêu cầu có liên quan đến việc phát triển sản phẩm và phát hành nó ra thị trường. Đây cũng chính là 3 phần chính cần có của một product portfolio.

Tính cách khách hàng và trải nghiệm với họ trong portfolio sẽ thể hiện cách bạn tận dụng nó trong khi làm việc ra sao. Và thông thường thì bạn sẽ có nhiều hơn một loại tính cách khách hàng trong portfolio của mình. Chẳng hạn sẽ có 5 yêu cầu khác nhau về sản phẩm trước đây cần được đề cập đến.

Còn với MVP, có rất nhiều loại MVP nhưng MVP phổ biến nhất là Mockups và videos. Nếu bạn có thể trực tiếp cho khách hàng xem các loại mockups và videos của sản phẩm thì những phản hồi từ khách hàng chắc chắn sẽ giúp bạn cải thiện sản phẩm sau đó tốt hơn rất nhiều.

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

Tạo một portfolio để thể hiện những kinh nghiệm mình có trước đây

Đối với công việc Product Manager, kinh nghiệm là một yếu tố cực kỳ quan trọng. Do đó những dự án mà bạn thể hiện trong portfolio khi tham gia chương trình Product Manager tuyển dụng sẽ giúp nhà tuyển dụng nắm bắt và xác định chính xác những kỹ năng mà bạn sở hữu. Lời khuyên của tôi là tất cả các bạn sinh viên nên dành ra ít nhất 20 tiếng để tạo cho mình một product portfolio. Vì làm như vậy sẽ giúp bạn hiểu rõ hơn công việc của một Product Manager là gì, để sau khi nhận việc bạn có thể bắt đầu vào guồng công việc nhanh nhất.

product manager tuyển dụng
Kinh nghiệm làm việc rất cần với vị trí quản lý sản phẩm

Trong trường hợp bạn chưa từng làm công việc nào liên quan đến quản lý sản phẩm trước đó thì ngay bây giờ bạn hãy bắt đầu bằng cách làm những dự án phụ. Thông thường các công ty startup sẽ có khá nhiều các dự án như thế cho bạn làm việc, và nhờ đó bạn cũng sẽ tích lũy thêm được kinh nghiệm cho bản thân mình.

  3 bài học xương máu mà mỗi Product Manager đều phải trải qua.
  Con đường trở thành Product Manager từ lập trình viên tại Amazon

Được phỏng vấn dựa trên Product Portfolio

Tôi dám khẳng định rằng nếu bạn đã đầu tư thời gian và công sức cho một chiếc product portfolio ấn tượng thì bạn sẽ được mời phỏng vấn dựa theo những gì bạn đã cung cấp trên mạng. Tôi đã từng hỏi các học viên của tôi rằng bạn có biết làm cách nào mà chúng ta có thể trở thành Product Manager dù không hề apply trước. Theo đó, các mối quan hệ xã hội sẽ giúp bạn làm điều này.

Khi bạn đăng tải các thông tin này của mình lên mạng xã hội hay các nền tảng tuyển dụng, những công ty nào đang cần tuyển Product Manager sẽ chú ý hơn đến portfolio của bạn, nhất là portfolio có nhiều kinh nghiệm làm việc.

Hãy đính kèm portfolio trong resume và đơn xin việc của bạn

Trong resume của mỗi người sẽ có một phần gọi là Product Manager Project, nơi bạn có thể tập hợp mọi dự án mà mình đã thực hiện. Trong đó bạn có thể chia sẻ về những lần làm việc với khách hàng trước của mình và những yêu cầu bạn đã vạch ra cho lộ trình làm việc của mình.

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

Mang theo portfolio đến buổi phỏng vấn

Trong suốt buổi phỏng vấn, nhà tuyển dụng sẽ liên tục hỏi bạn các câu hỏi liên quan đến công việc như khi nào thì bạn có thể cho phát hành một sản phẩm,… Các câu hỏi có thể sẽ được dựa trên portfolio của bạn, do đó nếu mang theo nó trong cuộc phỏng vấn trực tiếp, bạn không chỉ gây ấn tượng tốt hơn với người phỏng vấn mà còn giúp chính mình thoải mái hơn khi trả lời phỏng vấn.

Bài viết được transcript dựa trên video gốc

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

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

Kiến trúc sư phần mềm

kiến trúc sư phần mềm

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

Là dân IT hẳn mọi người không còn xa lạ với cụm từ Software Architect (SA) – ở đây tôi tạm dịch là kiến trúc sư phần mềm. Tuy nhiên không phải ai cũng hiểu được vai trò, trách nhiệm, công việc thực sự và con đường sự nghiệp của một SA. Đây là những câu hỏi mà tôi đã từng đặt ra khi bước vào những nấc thang đầu tiên của vị trí này. Tôi tự đi tìm lời giải đáp cho mình.
Kiến trúc sư phần mềm

PHÂN LOẠI KIẾN TRÚC SƯ PHẦN MỀM

Thật ra có nhiều cách để phân loại kiến trúc sư phần mềm. Tuy nhiên, ở đây tôi sử dụng cách phân loại của Microsoft.  Đây cũng là một cách thức phân chia khá phổ biến trong ngành phần mềm hiện nay.

  19 tips cho các kỹ sư phần mềm hữu ích trong 2024
  3 workhack để duy trì năng lượng tích cực tại công sở cho kĩ sư phần mềm
Tên Mô tả
Kiến trúc sư nghiệp vụ (enterprise architect) Là cầu nối giữa chủ sở hữu sản phẩm và đội ngũ kĩ thuật. Họ  là những người có kinh nghiệm chiều sâu trong lĩnh vực mà sản phẩm đang xây dựng.
Chịu trách nhiệm trong việc xây dựng và phát triển yêu cầu – thiết lập viễn cảnh, bộ khung của môi trường IT trong sản phẩm.
Kiến trúc sư hạ tầng (infrastructure architect) Là người chịu trách nhiệm trong việc thiết lập, xây dựng giải pháp về cơ sở hạ tầng IT (ví dụ: mạng, các vấn đề bảo mật, thiết bị/ phương thức lưu trữ, ..) trong sản phẩm để đáp ứng nhu cầu của doanh nghiệp.
Kiến trúc sư giải pháp (solution architect) Là người chịu trách nhiệm trong việc thiết kế, xây dựng giải pháp cho những yêu cầu của sản phẩm.
Kiến trúc sư kĩ thuật (Technology-specific architect) Là người chịu trách nhiệm về một hoặc một số lĩnh vực kĩ thuật cụ thể.

Trong một số công ty hiện tại ở Việt Nam, có một vị trí gọi là Technical Architect (kiến trúc sư kĩ thuật) trong tổ chức. Vị trí này chịu trách nhiệm cho việc phân tích, đánh giá giải pháp, xây dựng kiến trúc hệ thống. Nếu ánh xạ với cách phân loại trên thì TA chính là Solution Architect.

NHỮNG TÍNH CÁCH CẦN THIẾT CỦA MỘT KIẾN TRÚC SƯ PHẦN MỀM GIỎI

Cho dù bạn có là kiến trúc sư phần mềm nào, thì dưới đây là những tính cách bắt buộc phải có để đạt được đỉnh cao của nghề này:

1. Nhạy bén về kinh tế: mọi kiến trúc sư khi đưa ra giải pháp cho bất cứ bài toán nào cũng đều phải cân nhắc chi phí, lợi ích tương quan của doanh nghiệp. Đây là yếu tố then chốt đánh giá hiệu quả của một giải pháp.
2. Có tầm nhìn xa: khi tham gia vào một dự án, kiến trúc sư phải cân nhắc những giải pháp, công nghệ sắp xuất hiện, xem xét những thay đổi gần đây trong lĩnh vực công nghiệp đang phát triển… và làm cách nào để tận dụng tối đa giải pháp hiện tại trong tương lai.
3. Nghiên cứu kĩ thuật mới: một kiến trúc sư phải luôn luôn nghiên cứu những hướng kĩ thuật mới, từ kiến trúc IT cho đến những ứng dụng và xu hướng phát triển ứng dụng
4. Hiểu và có khả năng ứng dụng những framework,kiến trúc hệ thống, phương pháp luận trong quá trình phát triển phần mềm
6. Có thể làm việc trên những thông tin còn chưa rõ ràng.
7. Khả năng truyền đạt và giao tiếp

LÀM SAO ĐỂ TÔI CÓ THỂ TRỞ THÀNH MỘT KIẾN TRÚC SƯ PHẦN MỀM

Kiến trúc sư phần mềm là đỉnh cao của thang nghề nghiệp khi bạn chọn đi theo con đường kĩ thuật. Để trở thành một kiến trúc sư phần mềm, bạn nên theo những bước sau:
1. Định hướng rõ ràng về loại kiến trúc sư phần mềm bạn muốn trở thành
2. Xác định và xây dựng những kĩ năng cần thiết. Liên tục bổ sung kiến thức phù hợp cho loại hình kiến trúc sư mà bạn chọn
3. Không ngừng phấn đấu và khẳng định vai trò của một kiến trúc sư trong chính những dự án mà bạn đang tham gia.
4. Cố gắng rèn luyện và lấy những chứng chỉ quốc tế về kiến trúc sư kĩ thuật của những tập đoàn công nghệ lớn (Microsoft hoặc Sun). Microsoft bạn cần lấy được MCA (Microsoft Certificate Architect). Đối với Sun, bạn cần lấy được chứng chỉ: SCEA (Sun Certificate Enterprise Architect)

Con đường để trở thành một kiến trúc sư phần mềm đỉnh cao và chuyên nghiệp vẫn còn ở rất xa. Và có một điều tôi luôn tâm niệm là: dù ở bất kì ngành nghề nào, vị trí nào – việc phấn đấu để đạt được đỉnh cao trong sự nghiệp cũng đều đem lại những lợi ích như nhau so với những vị trí hoặc ngành nghề khác.

CHỈ LÀ MỘT VÀI THỨ TÔI MONG CHỜ Ở MỘT KIẾN TRÚC SƯ PHẦN MỀM (KTSPM).

KTSPM, trước hết, phải thấy xa hơn những gì mà một kĩ sư bình thường thấy và thực sự hiểu rõ về hệ thống. Có một chuyện khá là kì cục là các dự án hay bắt đầu bằng cách cho KTSPM viết ngày viết đêm ra một cái gọi là framework (framework ở đâu ra mà lắm thế), sau đó lui ra, và các kĩ sư bình thường sẽ nhào vô viết thêm tính năng, và chúng ta có một phần mềm. Sau đó có thể có chút trục trặc, chậm chạp thì các KSTPM này lại quay trở lại để dọn rác.

Nhưng hãy để tôi kể câu chuyện về dự án mà tôi đang làm đã. Đầu tiên chúng tôi có một KTSPM. Người này chuẩn bị mọi thứ, từ hệ thống build, database, Spring, Hibernate này kia, và cũng viết một ít làm mẫu. Và vì chỉ là làm giúp nên rời dự án nhanh chóng. Sau đó chúng tôi bỏ một thời gian dài loay hoay vừa muốn giữ cái nền này vừa muốn đập bỏ. Khi yêu cầu phần mềm thay đổi và vấn đề nảy sinh thì cái nền rõ ràng là không phù hợp. Nhưng cái nền là do KTS viết ra mà. Sự thiếu dứt khoát khiến cho mọi thứ trong hệ thống mà chúng tôi xây dựng vẫn còn khá là vá víu và không linh hoạt. Trong giai đoạn này có hai người nữa, một người là KTS và một người gần được KTS. Nhưng họ cũng chỉ viết mã cho một vài phần. Có thể là những phần khó hơn, nhưng nó chỉ là một phần nhỏ của toàn bộ bức tranh. Và nó cũng chứa những sai lầm tiềm ẩn như những nhiều phần khác. Và nó cũng có thể được hoàn thành bởi những kĩ sư khác trong dự án, mặc dù có thể là phải có một chút hướng dẫn. Nói tóm lại, những KTSPM đang làm những việc mà kĩ sư làm, chỉ là (có thể) ở một trình độ tốt hơn.

Vậy những sai lầm mà dự án tôi gặp phải và mắc kẹt là gì. Có thể kể ra những thứ khá cơ bản, như bỏ qua các bước an ninh cơ bản (chống XSS, CSRF), không xây dựng một dạng protocol (hay interface) thống nhất cho các request, bỏ lơ vấn đề cache và performance (cache phía server, cache phía client), không có hệ thống build tự động, không có phương pháp chung để xử lí vấn đề cross-browser, v.v. Đây là những vấn đề có tác động quan trọng tới thiết kế của phần mềm, nên không thể giải quyết một sớm một chiều được. Dĩ nhiên, phần mềm là một hệ thống phức tạp mà khi đã đầy đủ các bộ phận thì việc thay đổi sẽ tốn kém. Vì vậy, không thể ngày hôm nay nghĩ về vấn đề này thì xây dựng nó một kiểu, rồi mai gặp hay chợt nghĩ về vấn đề khác thì sửa đối nó theo kiểu khác.

Tất nhiên KTS vẫn nên là người viết những thành phần quan trọng, để góp phần tạo ra một phần mềm có chất lượng tốt. Nhưng kĩ sư giỏi thì cũng có thể viết được những phần khó, họ cũng có thể đọc sách, tìm hiểu, suy nghĩ. Vậy thì giá trị đặc biệt của KTSPM nằm ở chỗ nào, tại sao họ đứng trên một cấp, và lương cao hơn? Theo tôi nghĩ đấy là vì kĩ sư giỏi là những người chỉ giải quyết được những vấn đề cục bộ, riêng rẽ, chứ không thể quan sát hệ thống một cách tổng thể. KTSPM phải là người định hướng. Họ phải liệt kê ra được những yêu cầu, vấn đề, hoặc thử thách mà dự án sẽ đối mặt, trước mắt và tương lai. Họ phải xây dựng được những quy tắc chung để kĩ sư có thể tuân theo nhằm hạn chế sai sót. Họ phải biết phân bổ nhân lực cho hợp lí với từng phần việc. Và họ phải nắm tình trạng phát triển hiện tại của phần mềm để nhận ra những bài toán hay cải tiến cần được thực hiện một cách thực sự đúng đắn và dứt khoát.

(Bạn nghỉ ngơi một xíu trả lời câu này xem. Nếu bối rối thì chắc chưa phải KSTPM rồi.)

Không chỉ nhìn xa hơn những kĩ sư, KTSPM còn phải cố gắng nhìn xa hơn những gì ông chủ nghĩ. Không phải là về kinh doanh, mà là về chức năng của phần mềm. Họ phải biết trừu tượng hóa các yêu cầu cụ thể để có cái nhìn bao quát cho chức năng mà trong đó yêu cầu của những người phân tích nghiệp vụ chỉ là một lựa chọn, một hướng hiện thực cụ thể. Ý định của con người luôn thay đổi rất nhanh, và yêu cầu cũng vậy, nên không có lí do gì lập trình viên đặt niềm tin là những thứ họ phải làm hiện tại sẽ giống vậy mãi mãi. Chuẩn bị tốt cho những lựa chọn chưa xảy ra sẽ giúp phần mềm linh động với những nhu cầu, đòi hỏi từ thị trường. Và điều quan trọng là thấy trước thay đổi của hệ thống là nhiệm vụ của KSTPM, không cần ai khác phải nói ra, và họ sẽ không thể đổ lỗi đi đâu đó như người phân tích nghiệp vụ, hay người dùng nếu không thực hiện tốt nhiệm vụ này.

Chẳng hạn, hãy nói việc hỗ trợ bookmark cho những web application dùng AJAX nhiều. Nếu một trang web mà trạng thái của nó, như đang mở tab nào, đang hiện nội dung gì, không được thể hiện trên địa chỉ thì người dùng sẽ không thể bookmark để quay lại trạng thái đó một cách nhanh chóng được. Tuy nhiên, yêu cầu phần mềm thường quên mất chuyện này, trong khi nếu không được thiết kế ngay từ đầu thì việc chỉnh sửa thiết kế của ứng dụng để hỗ trợ chức năng này sẽ khá rắc rối. Do nên KTSPM phải biết tự thấy trước và đáp ứng chức năng ngay khi chưa có yêu cầu.

Có thể tóm lại là KSTPM trước hết phải biết nhìn xa, nhìn trừu tượng, không chỉ xây nên framework mà còn những tiêu chuẩn, quy định, và đường lối cho dự án.

Điều thứ ba, liên quan đến cách mà một KTSPM làm việc với nhân viên (và sẽ không viết ở đây).

Nguồn: fly2universe.wordpress.com

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

Mô hình State Machine trong Distributed Systems

Mô hình State Machine trong Distributed Systems

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

Khi tìm hiểu và làm việc với Distributed Systems, chúng ta có thể sẽ hay bắt gặp những cụm từ như: Replicated State machineLog replication hay Event-drivenEvent-sourcing. Về bản chất, những khái niệm này đều được xây dựng xung quanh mô hình “Máy trạng thái” (State machine). Bài viết này sẽ mô tả mô hình này và lý do tại sao State machine lại được áp dụng rộng rãi trong Distributed Systems.

  Hướng dẫn sử dụng ReactJS Props và State
  Stateless là gì? Stateful là gì?

Nhắc lại sơ qua một vài khái niệm

  • Trạng thái (state) của một process có thể hiểu là tập hợp các giá trị của các biến (variable) trong process đó. VD, nếu process p1 có thể có state S1 = {x=1, y=2}. Thường trong thực tế, một process sẽ có cả dữ liệu trong RAM lẫn trên đĩa cứng, chúng ta coi tất cả các dữ liệu này là state của process đó.
  • State machine trong tin học là một mô hình tính toán, trong đó một máy tính (machine) thay đổi trạng thái (state) dựa theo chuỗi input mà nó được cung cấp. Ta hãy lấy ví dụ một bài toán: xác định xem trong một dãy số nhị phân (VD: 110100101), số chữ số 0 là chẵn hay lẻ. Bài toán này có thể giải bằng cấu trúc State machine, trong đó chuỗi input là chuỗi các chữ số nhị phân, và “state” có thể là “chẵn” (S1) hay “lẻ” (S2). State machine này bắt đầu từ trạng thái S1 (có 0 chữ số 0), và với mỗi giá trị chữ số, nó thay đổi trạng thái theo như hình minh họa bên dưới. Trạng thái cuối cùng cũng là kết quả (output) của bài toán.
  • Về thứ tự của các phần tử trong một tật hợp. Giả sử ta có một tập hợp S={x1,x2,x3,x4}. Nếu tất cả các phần tử của tập hợp này có thể được sắp xếp theo một thứ tự cố định (VD: x1 < x2 < x3 < x4), bao gồm cả tính bắc cầu (x1 < x2, x2 < x3 => x1 < x3) và phản đối xứng (x1 <= x2 & x2 <= x1 => x1 = x2), thì tập hợp này được gọi là có thứ tự toàn phần (total order). Nếu không thỏa mãn điều kiện trên thì tập hợp này có thứ tự một phần (partial order). Khái niệm này quan trọng trong việc xác định thứ tự các sự kiện trong Distributed Systems. Bạn có thể tham khảo kĩ hơn về lý thuyết thứ tự của tập hợp tại đây.

Mô hình State Machine trong Distributed Systems

Bắt đầu từ một cấu trúc quen thuộc: log

Hầu như ai làm dev cũng đều phải quen làm việc với log. Nói đơn giản thì log là một chuỗi các dữ kiện giúp lưu lại thông tin về những sự kiện đã xảy ra trong quá trình phần mềm vận hành. Mỗi dữ kiện được gọi là một entry. Ví dụ, đây là một đoạn log của dpkg trên Ubuntu:

$ tail -f /var/log/dpkg.log

2020-09-21 01:51:20 status installed man-db:amd64 2.9.1-1
2020-09-21 01:51:21 trigproc dbus:amd64 1.12.16-2ubuntu2.1 <none>
2020-09-21 01:51:22 status half-configured dbus:amd64 1.12.16-2ubuntu2.1
2020-09-21 01:51:23 status installed dbus:amd64 1.12.16-2ubuntu2.1
2020-09-21 01:51:24 trigproc mime-support:all 3.64ubuntu1 <none>
2020-09-21 01:51:25 status half-configured mime-support:all 3.64ubuntu1
2020-09-21 01:51:26 status installed mime-support:all 3.64ubuntu1
2020-09-21 01:51:27 trigproc initramfs-tools:all 0.136ubuntu6.3 <none>
2020-09-21 01:51:28 status half-configured initramfs-tools:all 0.136ubuntu6.3
2020-09-21 01:51:29 status installed initramfs-tools:all 0.136ubuntu6.3

Một log entry trong ví dụ trên bao gồm hai thông tin: một là mô tả về sự kiện, hai là thời điểm (timestamp) xảy ra của sự kiện. Loại log quen thuộc này thường được gọi là Application log, mục đích chính của nó là giúp chúng ta truy tìm thông tin khi cần thiết (ví dụ như để truy vết bug chẳng hạn). Lưu ý là, các entry trong log luôn có thứ tự toàn phần (total order). Đối với log kể trên thì giá trị của timestamp là yếu tố xác định thứ tự của các entry. Log entry chỉ có thể được thêm vào log, chứ không thể bị xóa đi hay thay đổi. Thuật ngữ mô tả quy tắc này là “append-only”.

Trong lý thuyết về Distributed Systems, hai thành phần thông tin kể trên của log (nội dung và thứ tự của sự kiện) đóng vai trò quan trọng. Các hệ thống Distributed Systems hiện nay đều được xây dựng xung quanh việc đồng thuận về nội dung của chuỗi log. Hệ quả này dựa trên nguyên lý (tạm gọi là nguyên lý nhân bản trạng thái) như sau:

Nếu ta có hai process tất định (deterministic) như nhau và chúng xử lý cùng chuỗi dữ liệu đầu vào (input) như nhau, thì chúng sẽ có đầu ra (output) và trạng thái cuối cùng (state) như nhau.

Deterministic process ở đây được hiểu là process chỉ vận hành dựa trên việc xử lý input chứ không phụ thuộc vào các yếu tố bên ngoài (VD như yếu tố thời gian, yếu tố ngẫu nhiên…). Hiển nhiên là hai hệ thống deterministic như nhau nếu cùng nhận một chuỗi input sẽ cho ra kết quả như nhau. Do đó, chúng ta có thể lưu trữ hoàn toàn lịch sử trạng thái của một hệ thống bằng việc lưu trữ chuỗi input dưới dạng log.

Đến đây thì chúng ta có thể nhận thấy được sự liên quan giữa “log” và “State machine”. Nếu ta có một deterministic process được cấu trúc theo dạng State machine và một log lưu lại các input của process này, ta có được toàn bộ thông tin về quá trình hoạt động của process. Lấy ví dụ, một hệ thống ngân hàng cần lưu trữ thông tin tài khoản của khách hàng. Ta có thể lưu những yêu cầu xử lý của khách hàng dưới dạng input log như sau:

1. Tài khoản X được khởi tạo.
2. Tài khoản X nạp 100.000 VND.
3. Tài khoản Y được khởi tạo.
4. Tài khoản X chuyển cho tài khoản Y 50.000 VND.
5. Tài khoản Y rút ra 20.000 VND.

Từ log trên ta có thể dễ dàng tính ra trạng thái cuối cùng của hệ thống này (sau sự kiện 5) là {X=50.000, Y=30.000}. Tuy nhiên, ngoài ra, cấu trúc input log này có một vài ưu điểm như sau:

  • Thứ nhất, cấu trúc này lưu trữ được nhiều thông tin hơn là việc lưu trạng thái thông thường. Ở đây ta mặc nhiên có được một lịch sử giao dịch cho tài khoản X và Y. Điều này cho phép ta có thể xác định được trạng thái của hệ thống trong bất kì thời điểm nào.
  • Thứ hai, cấu trúc này hỗ trợ khả năng đối phó sự cố (fault tolerant) của hệ thống. Nếu như một server bị crash trong quá trình hoạt động, thì khi phục hồi, ta có thể tái thiết lại trạng thái cho server đó bằng cách “chạy” lại input log này (đây còn được gọi là ‘log replay’).
  • Kết cấu này cũng mang tính đàn hồi (scalable) cao. Dữ liệu log kể trên có thể được nhân bản hay chuyển hóa thành các dạng dữ liệu khác nhằm phục vụ cho các mục đích khác nhau. Ta sẽ bàn về điều này nhiều hơn trong phần Event sourcing.

Log replication và Replicated State machine.

Ở phần 2, chúng ta đã nói sơ qua về tầm quan trọng của bài toán đồng thuận (consensus) trong DS. Bài toán này thực ra là phiên bản đơn giản hóa, vì yêu cầu đặt ra chỉ là giúp các server đồng thuận 1 giá trị. Trên thực tế, các hệ thống khi vận hành phải tiếp nhận yêu cầu của người dùng và thay đổi trạng thái liên tục, do đó bài toán ở đây là các server phải đồng thuận một chuỗi giá trị thay đổi theo thời gian. Các server cũng có thể bị mất kết nối hoặc crash, khiến cho việc đồng bộ thông tin giữa các máy càng trở nên phức tạp. Lấy ví dụ, nếu một server crash và sau đó phục hồi, khi đó trạng thái của server này đã khác biệt so với các server khác. Làm thế nào để ta biết được trạng thái nào mới là trạng thái đúng?

Mô hình Replicated State machine (các máy trạng thái nhân bản), hay Log replication, được phát triển nhằm giải quyết vấn đề này. Trong mô hình này, mỗi server trong hệ thống được cấu trúc dưới dạng State machine, tương đồng với Deterministic process được nêu ở phần trên. Log trong trường hợp này là chuỗi các input mà hệ thống nhận được từ người dùng (client), sắp xếp theo thứ tự thời gian (total order). State machine và log này được nhân bản ra tất cả các server trong hệ thống nhằm giúp các máy đồng thuận với nhau. Có nhiều cơ chế để thực hiện thao tác nhân bản này, ví dụ như leader/follower (thuật toán Raft), hay atomic broadcast (thuật toán ZAB). Chúng ta sẽ tìm hiểu sâu hơn về các thuật toán này trong các bài sau.

Mô hình State Machine trong Distributed Systems

Điểm ưu việt của cơ chế này là, trong trường hợp một server nào đó fail, server này có thể phục hồi trạng thái bằng cách replay lại log. Các server cũng có thể so sánh phiên bản log của mình và xác định được phiên bản nào là phiên bản được cập nhật mới nhất (dựa trên thứ tự các entry trong log). Ngoài ra, nếu một server mới được thêm vào hệ thống, server này cũng có thể đồng thuận với các server còn lại thông qua cơ chế tương tự.

Mối liên hệ đến Event-sourcing

Replicated State machine (RSM) và Event-sourcing (ES) là hai khái niệm khác nhau. RSM chỉ về mô hình consensus trong Distributed Systems nói chung, trong khi đó ES nói về cách tổ chức và sắp đặt dữ liệu của một ứng dụng cụ thể. Tuy nhiên, hai khái niệm này dựa trên cùng một nguyên lý nhân bản trạng thái nêu trên, nên ta hãy bàn sơ qua về ES ở đây một chút.

Event-sourcing hoạt động dựa trên việc lưu lại dữ liệu của một hệ thống dưới dạng một chuỗi các sự kiện (event) theo thứ tự thời gian trong một cấu trúc Event Log. Event log này là dữ liệu duy nhất mô tả trạng thái của hệ thống, tại thời điểm hiện tại cũng như trong quá khứ. Kiến trúc ES hoạt động khác biệt so với kiểu trên trúc phổ thông thêm-sửa-xóa (CRUD). Thử ví dụ về hệ thống ngân hàng ở phần trước: một hệ thống theo kiểu CRUD có thể lưu mỗi tài khoản ở một dòng trong bảng SQL, trong khi đó, với ES, ta lưu tất cả các sự kiện trong hệ thống trong một chuỗi event duy nhất (xem VD ở trên). Cũng giống như input log, Event log cho phép tái tạo lại dữ liệu của hệ thống ở bất kì thời điểm nào.

Điểm cộng lớn nhất của cách bố trí dữ liệu kiểu này nằm ở sự đơn giản: một chuỗi sự kiện duy nhất chứa đầy đủ các thông tin của hệ thống, từ số tiền hiện tại đến lịch sử giao dịch của một tài khoản. Theo kiểu CRUD, ta sẽ phải có một bảng riêng biệt để lưu lịch sử các giao dịch của các tài khoản, và sử dụng JOIN khi cần truy cập dữ liệu ở nhiều bảng khác nhau. Với ES, ta chỉ có một chuỗi duy nhất (thường được gọi là single source of truth).

Sự đơn giản này giúp các hệ thống ES có tính đàn hồi (scalability) cao. Với kiểu CRUD, thường thì ta sẽ phải thiết kế Database nhằm tối ưu cho cả việc đọc và ghi dữ liệu. Tuy nhiên không phải dữ liệu nào cũng có thể tối ưu được một cách tuyệt đối. Hầu hết các hệ thống đều phải hy sinh hiệu năng cho việc đọc (hoặc ghi) để tối ưu cho hoạt động còn lại. Hơn nữa, các ứng dụng trên thực tế đều phải thay đổi theo thời gian để liên tục đáp ứng yêu cầu mới, do đó, việc tối ưu database ngay từ đầu gần như là bất khả thi.

Mô hình State Machine trong Distributed Systems

Với ES thì dữ liệu được tổ chức theo kiểu hoàn toàn khác biệt. Tất cả tiến trình ghi (write) đều có hiệu năng cao, do chỉ phải thêm (append) event (do event không được phép sửa/xóa). Các event này sau đó được chuyển hóa thành các dạng dữ liệu được tối ưu cho việc đọc (có thể là trong một bảng SQL hoặc các database khác). Quy trình này được gọi là projection (Xem hình minh họa ở trên), trong đó Event log tại từng thời điểm nhất định được chuyển hóa thành các snapshot nhằm tối ưu việc truy cập dữ liệu. Điều này giúp cho hệ thống không bị bó buộc bởi cấu trúc quan hệ – thực thể (entity-relationship) trong các kiểu dữ liệu truyền thống.

Bài viết gốc được đăng tải tại dhhoang.github.io

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

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

Hiểu về Dependency Injection

Hiểu về Dependency Injection

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

Search trên Google các bạn có thể tìm thấy hàng đống bài viết về cái chủ đề này, mỗi người một kiểu trình bày khác nhau. Có thể có bạn sẽ lĩnh hội rất nhanh, cũng có thể không nên mình xin tổng hợp lại và cố gắng viết lại nó theo một kiểu dễ hiểu nhất (sẽ cố gắng hết sức 😀 ).

Ý tưởng chính của Dependency Injection đó là bạn không phụ thuộc vào ai cả và người khác cũng không phụ thuộc vào bạn. Khi cần mình sẽ gọi bạn và bạn cũng vậy.

Để mình nói cụ thể hơn nhé!

  SQL Injection là gì? Cách giảm thiểu và phòng ngừa SQL Injection
  Codepen là gì ? Hướng dẫn sử dụng Codepen cơ bản

Ngày xưa mình thường viết code như thế này:

Giả sử bạn có một đối tượng là Circle, đối tượng này có một phương thức là draw() như sau:

public class Circle {
public void draw() {
System.out.println("Drawing circle ...");
}
}

Giờ mình muốn sử dụng đối tượng này để vẽ hình tròn, mình sẽ khởi tạo đối tượng Circle ngay trong constructor và mình sẽ code như sau:

public class Drawing {
public Circle circle;

public Drawing() {
circle = new Cirle();
}

public void preparing() {
System.out.println("Preparing ...");
}

public void draw() {
circle.draw();
}

public static void main(String[] args) {
Drawing drawing = new Drawing();
drawing.draw();
}
}

Rõ ràng bạn thấy đối tượng Drawing của mình đang phụ thuộc vào đối tượng Circle của bạn (nghĩa là mình đang phụ thuộc vào bạn đấy), bởi vì mỗi khi chạy ứng dụng, đối tượng Drawing lại phải giữ luôn thông tin của đối tượng Circle. Đây là nhược điểm thứ nhất của cách code này.

Nhược điểm thứ hai đó là nếu sau này mình muốn vẽ một tam giác, mình lại phải đi khai báo lại đối tượng khác để đáp ứng nhu cầu của mình. Đối tượng Drawing của mình vì thế cứ phải thay đổi liên tục theo nhu cầu.

Vậy giờ làm sao để giải quyết hai nhược điểm này?

Nhược điểm thứ hai chúng ta có thể giải quyết dễ dàng bằng cách sử dụng interface. Đối tượng Circle của bạn giờ sẽ hiện thực một interface tên là Shape, cụ thể như sau:

public interface Shape {
public void draw();
}

Sau này mình muốn vẽ tam giác thì chỉ cần viết thêm một lớp mới và hiện thực interface Shape là được.

Đối với nhược điểm thứ nhất, Dependency Injection sinh ra để giải quyết nó.

Hãy xem Dependency Injection giải quyết như thế nào nhé, mình xin sửa lại đối tượng Drawing như sau:

public class Drawing {
private Shape shape;

public Drawing(Shape shape) {
this.shape = shape;
}

public void setShape(Shape shape) {
this.shape = shape;
}

public void preparing() {
System.out.println("Preparing ...");
}

public void draw() {
shape.draw();
}
}

Các bạn thấy đó, nếu bây giờ mình chỉ muốn đối tượng Drawing của mình chỉ chuẩn bị các dụng cụ để vẽ mà thôi, mình sẽ không cần gọi đến đối tượng Circle của bạn, code sẽ như sau:

Drawing drawing = new Drawing(null);
drawing.preparing();

Và giờ sau khi chuẩn bị xong, mình sẽ cần bạn để vẽ một hình tròn, mình sẽ gọi đến bạn:

Drawing drawing = new Drawing(null);
drawing.preparing();

Shape shape = new Circle();
drawing.setShape(shape);
drawing.draw();

Thật ra, những code này nhiều bạn đã làm rồi nhưng không biết nó là Dependency Injection thôi.

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

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

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

Đặt tên trong code như nào cho bớt ngu?

Đặt tên cho code

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

1. Khái niệm đầu tiên

Chuyện đặt tên thì chả ai dạy ở trường DH cả, toàn hứng như nào thì đặt như vậy thôi. Nếu ông nào nói với tôi trường ông dạy cách đặt tên, quy tắc các kiểu thì chúc mừng ông thế thôi.

  "Code dễ đọc" là như thế nào?

  Vừa học vừa chơi! Top 15+ game lập trình miễn phí

Tên thì bất cứ đâu trong code của bạn. Tên biến, tên hàm, tên lớp, packages… Vậy thì đặt tên như nào cho chuẩn? Hồi mới đi làm, sếp nói 1 câu nhớ tới bây giờ: Em cứ đặt tên dài cũng được, miễn là nó giải thích luôn tên đó để làm cái gì, còn hơn là đặt abc  i hay j mà chả biết mục đích nó là gì cả. Càng đơn giản càng tốt. Ví dụ bây giờ ta đặt tên ngày tháng năm trong C++:

int a, b, c;

Tôi tự hiểu a là ngày, b là tháng, c là năm! Đem code cho thầy đọc méo hiểu đúng không? Vậy đấy là cái ngu nhiều ông dễ mắc phải.

Sửa lại:
int ngay, thang, nam;

Ít nhất 3 cái biến kiểu nguyên trên cũng đã giải thích luôn nó để lưu cái gì.

Sách gốc đặt:

int elapsedTimeInDays;

int daysSinceCreation;

int daysSinceModification;

int fileAgeInDays;

Trông nó clear chưa? Vậy quy tắc đầu tiên tôi muốn nhét vào mũi bạn là đặt tên thì đặt cho dễ hiểu vào, không sau thằng đọc code bạn nó lại “dm thằng lol cái méo gì thế này”

Bây giờ thử đọc đoạn code sau:

std::vector<int> getThem() {

    std::vector<int> list1;

       for (int i = 0; i < theList.size(); i++)

        if (theList[0] == 4)

                list1.push_back(theList[i]);

    return list1;    

}

Các ông hiểu mẹ gì không? theList là cái méo gì?  Tại sao lại so sánh với 4?

Rồi méo hiểu đúng không. Thế nên bây giờ đọc đoạn code sau xem thế nào:

#define FLAGGED 4

std::vector<int> getFlaggedCells() {

    std::vector<int> flaggedCells;

    for (int i = 0; i < gameBoards.size(); i++)

        if (theList[0] == FLAGGED)

                flaggedCells.push_back(theList[i]);

    return flaggedCells;

}

Đọc từng dòng: Đầu tiên là định nghĩa 4 có nghĩa là FLAGGED. Sau đó đổi tên hàm thành getFlaggedCell. Hàm này trả về danh sách cell flagged. Cái flggedCell là cái cần trả về. Lấy từng phần tử tỏng gameBoard so sánh với FLAGGED để xem nó có phải là flagged hay không. Đấy, cùng 1 logic máy hiểu như nhau, nhưng rõ ràng với người thì chỉ hiểu được cái hàm khi ông ta đã đặt lại các thứ 1 cách clean!

2. Tiền tố trong tên

Trước mới vào nghề IT, tôi thường hay thêm cái prefix ở đầu. Ví dụ:

class Date {

int day;

};

Tôi sửa thành:

class Date {

int mDay;

};

Nói chung đây là 1 quy tắc hay áp dụng ngay cả java nữa. Nhưng bạn thích đặt hay không tuỳ bạn, miễn phải ghi nhớ như sau:

Giả sử trung C++ ta có hàm setDay:

void Date::setDay (int day) {

mDay = day;

}

Giả sử bạn muốn dùng biến day trong class Date trên thì bạn sẽ phải dùng con trỏ this như này:

void Date::setDay (int day) {

this.day = day;

}

để phân biệt day ở trong là day của class Date, còn day kia là tham số truyền vào.

Nếu bạn quên không dùng this thì coi như tự gán nó vào nó. Kết quả là sai! May mắn bây giờ các IDE có màu sắc phân biệt cho dev đỡ nhầm rồi. Tuy nhiên các newbie mới vào nghề thì vẫn hay lơ mơ mà nhầm lắm.

Chốt lại bạn muốn dùng tiền tố cũng được, không dùng cũng được nhưng phải tỉnh. Sách nói là bạn không nên dùng, đừng cố làm nó phức tạp. Nhưng tôi nghĩ dự án ông sếp yêu cầu thì vẫn phải dùng thôi. CLingme tụi tôi chẳng hạn, có 1 lô lốc yêu cầu đặt prefix luôn :))

ví dụ tôi thường thêm m_o cho object, m_i cho biến integer, m_c cho biến char,…

3. Interface và implementation

Interface là cái mẽ gì? Đơn giản tôi hay dùng nó trong C++ như này:

class TheFunyFuck;

class ITheFuckAllDelegate {

public:

virtual void onFuck(TheFunyFuck* sender) = 0;

};

Thì cái lớp IFuckAllDelegate được gọi là lớp interface – giao diện =)) sao lại là giao diện? Giao diện là cái bạn trông thấy tên hàm mà méo thấy phần code của hàm. Hàm virutal ảo thì làm gì có code, ông nào kế thừa lại lớp IFuckAllDelegate thì mới bắt buộc phải viết code. Ở đây quy tắc là nếu như lớp đó là Interface thì bắt đầu bằng I.

Implementation là việc xử lý lại interface đó. Tôi cũng chưa gặp bao giờ việc viết code cho nó nên cũng chưa rõ cách đặt tên thế nào cho chuẩn. Ví dụ trong sách, anh em tự nghiên cứu:

ShapeFactoryImp

4. Tên lớp

Tên lớp là danh từ hay cụm danh từ và bắt đầu bằng chữ cái viết hoa. Ví dụ:
class Sinhvien;

class Giaovien;

Méo ai đặt tên là:
class Lambaitap;

class Daysinhvien;

class cailogithon;

5. Tên phương thức

Tên phương thức là động từ hay cụm động từ, bắt đầu bằng chữ cái thường. Ví dụ các bạn hay thấy hàm set và get:

void setName(string name);

string getName();

Méo ai lại đặt như này:

void SetName(string name);

Còn trường hợp hàm tạo và quá tải hàm thì làm như nào? Ví dụ bạn có hàm tạo phân số như này:

Phanso(string tuso, string mauso);

Phanso(int tuso, int mauso);

Phanso(float tuso, float mauso);

Thì bọn nó khuyên là nên làm như  này:

void FromInt(int tuso, int mauso);

void FromFloat(int tuso, int mauso);

void FromString(string tuso, string mauso);

Và khi dùng thì chỉ cần gọi:

Phanso pt;

pt =pt.FromInt(2, 3);

Kiểu nó thế :)) Cái này thì ở C++ tôi thấy không hay dùng, nhưng java thì lắm lắm.

Thôi chốt là tên lớp thì là danh từ và viết hoa chữ đầu. Tên phương thức là động từ và viết thường chữ đầu ha 🙂

Tiếp nữa là đừng có cố đặt những cái tên mỹ miều mà ý nghĩa chả là mấy.

Nói về con người bạn nghĩa là gì, thì nghĩa đó chính là con người bạn. (

Say what you mean. Mean what you say) dịch hơi tù =))

Bài này tôi viết ngắn vậy thôi, viết dài thành viết dại. Happy!

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

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

Áp dụng Bài đánh giá ứng viên vào Quy trình tuyen dung IT?

tuyen dung it
tuyen dung it

Các bài kiểm tra năng lực coding là được xem là cách thức hiệu quả trong việc đánh giá kỹ năng ứng viên. Điều này có nghĩa ý lớn trong tuyen dung it, freelancer it. Tuy nhiên, để tối ưu hóa thông qua những ảnh hưởng cụ thể, nhà tuyen dung it cần nắm bắt được 2 yếu tố sau đây: 

(1) Khi nào 

(2) Bằng cách nào ứng dụng được nó vào quy trình tuyển dụng hiện tại.

Tuyển được đúng người luôn là mục tiêu của các nhân sự viên IT. Thế nhưng, những thách thức về bài toán đánh giá ứng viên chưa bao giờ là dễ dàng. Mỗi quy trình trong tuyen dung it đều có tính quan trọng. Nó sẽ đảm bảo việc ứng viên phải làm bài test theo đúng tâm lý và nguyện vọng của họ một cách tự nguyện, không phải thiên cưỡng. Từ đó mới được tỉ lệ ứng tuyển cao hơn, và candidate engagement tốt hơn.

Trước khi đi vào đánh giá ứng viên trong tuyen dung IT

Xét riêng về khía cạnh sàng lọc ứng viên (screening) đầu vào để tiến vào các bước trong quy trình tuyen dung it, hiện tại vẫn còn không ít những hiểu lầm; hiểu sai về số năm kinh nghiệm cũng như level đầu vào của ứng viên.

Để tiến vào khâu đánh giá ứng viên, trước hết nhân sự IT cần hiểu rõ các mức kinh nghiệm của ứng viên Lập trình, freelancer it hiện nay:

* Tính đến thời điểm năm 2020

Số năm kinh nghiệm Năm sinh ứng viên
Entry-level Mới ra trường 1998
1 năm KN 1997
2 năm KN 1996
Mid-level 3 năm KN 1995
4+ năm KN Từ 1994 về trước

 

Trong thời điểm chuyển giao tuyển dụng sang thế hệ Gen Z, các ứng viên có độ tuổi khoảng từ năm 1994-1996 thường vẫn bị hiểu lầm là cấp “Mới ra trường” – “Graduated”.

Song trên thực tế, đây là các ứng viên đều đã có tối thiểu 2 năm kinh nghiệm nếu làm việc đúng ngành từ khi tốt nghiệp. Các nhà tuyển tuyen dung it cần tránh hiểu lầm tai hại này để không bỏ lỡ các hồ sơ có năng lực và phù hợp nhưng bị đánh giá là “thiếu kinh nghiệm”.

Bài test đánh giá ứng viên ảnh hưởng như thế nào đến candidate engagement

Bài đánh giá năng lực có thể ảnh hưởng rất lớn đến hiệu quả tuyển dụng của bạn từ trước đến nay. Tuy nhiên, vẫn chưa có cách tối ưu hiệu quả nhất cho nó.

Các công ty công nghệ lớn nhất trên thế giới, dù tập đoàn hùng mạnh hay công ty khởi nghiệp mới đều có chung một ưu tiên: thứ tự sắp xếp test năng lực. Thông thường, họ đều sẽ sắp xếp bài test vào giai đoạn phỏng vấn technical thông thường (manual tech screen).

Điểm đặc biệt của test coding là đòi hỏi không ít công sức và quan trọng là sự đồng thuận của ứng viên. Không phải ứng viên nào cũng sẽ bằng lòng và sẵn sàng thực hiện đánh giá năng lực này. Nói cách khác, khi ứng viên nghe về đánh giá năng lực, một bộ phận nhỏ “leave the chat”. Mặt khác, vẫn có nhiều bạn rất sẵn lòng tham gia kiểm tra đánh giá. Chính thứ tự và cách sắp xếp bài đánh giá của bạn sẽ ảnh hưởng đến sự sẵn lòng của ứng viên với bài test.

Vậy mục tiêu tìm kiếm là gì?

Mục tiêu là tìm được sự cân bằng: vừa tối ưu hóa sự tham gia của ứng viên. Đồng thời lại vừa tối thiểu hoá áp lực lên team bạn. Khi nói đến đánh giá mã hóa, điều đó có nghĩa là xem xét 3 yếu tố chính:

  • Số lượng ứng viên ứng tuyển (nhiều hay ít)
  • Nguồn ứng viên (nhà tự tuyển hay outsource)
  • Level kinh nghiệm của vị trí và ứng viên (mới ra trường hay có kinh nghiệm)

Việc phác thảo nên một quy trình tuyen dung it chi tiết hướng đến sự thay đổi mang tính hợp lý, có hiệu quả. Đồng thời, tạo nguồn ứng viên tốt nhất mà không đè áp lực đánh giá lên team mình.

Điều đó đồng nghĩa rằng các ứng viên chất lượng sẽ tiếp tục stay engaged. Song, tỉ lệ tham gia sẽ tăng cao; Tech talent brand của bạn sẽ để lại những ấn tượng tốt trong giới Lập trình viên nói chung, và giới IT tìm việc nói riêng.

03 nhân tố chính ảnh hưởng lên quy trình tuyen dung IT

tuyen dung it
Những nhân tố nào ảnh hướng đến ứng viên IT?

Liệt kê ra sẽ có vẻ hơi quá rõ ràng. Nhưng chính 3 nhân tố này sẽ giúp bạn quyết định được đâu là thời điểm phù hợp đánh giá ứng viên hợp lý và đúng với mức độ sẵn lòng của ứng viên.

1. Số lượng cao vs. thấp 

Bạn có đang tuyển dụng trong mùa cao điểm (ví dụ: mùa tốt nghiệp giữa năm)? Hoặc bạn đang có quá nhiều đơn ứng tuyển mà không có thời gian để review? Nếu như team tuyển dụng của bạn đang phải sử dụng nhiều cách shortcut hoặc loại trừ để hoàn thiện quy trình (ví dụ: chỉ chấp nhận các CV có tiêu chí nào đó nhất định), nó có nghĩa là bạn đang xử lý một lượng ứng viên lớn.

Mặt khác, nếu việc tuyen dung IT đang ở mức ổn định. Tức là team có thể chọn lọc các các đơn ứng tuyển mà không phải skip quá nhiều tiêu chí. Điều này chứng tỏ bạn đang có lượng ứng viên thấp vừa.

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

Nhìn chung, các vị trí phát triển phần mềm, thiết kế đều sẽ có số lượng ứng tuyển cao. Mặt khác, các vị trí như tuyển dụng Data Scientist thì có xu hướng ít lượng ứng tuyển hơn.

2. Nguồn ứng viên tự tuyển (Inbound) vs. Nguồn ứng tuyển bên ngoài (Sourced)

Có một nguyên tắc như sau: Nếu nguồn CV của bạn chủ yếu đến từ tin đăng nội bộ, tức là nguồn thiên inbound. Mặt khác, nếu như bạn phải tận dụng các nguồn khác để fill CV (ví dụ thông qua LinkedIn, referral hoặc cách khác) thì có nghĩa là nguồn thiên source.

Nguồn ứng cử viên cũng có mối quan hệ chặt chẽ với vị trí tuyen dung it. Ở mức “mới ra trường” thì nguồn CV sẽ dễ đến từ nguồn nội bộ – inbound hơn. Ví dụ qua trang Tuyển dụng – Career của công ty bạn. Ngược lại, ở mức yêu cầu kinh nghiệm, bạn đơn giản chỉ cần  thường sẽ phải cần đến các nguồn tuyển dụng ngoài. Và tất nhiên, cần nhiều công tìm CV hơn để kéo ứng viên apply vào. 

3. Entry-Level vs. Mid-Level

Vị trí bạn đang tuyển có yêu cầu không, và bao nhiêu năm nếu có? Bạn có thể tập trung vào các vị trí bạn hay tuyen dung it nhất. Mặc dù mọi tổ chức đều có định nghĩa – yêu cầu riêng. Nhưng chúng ta thường thấy các công ty sẽ sắp xếp level như sau:

Entry-level sẽ dành cho nhóm từ 0-3 năm (ứng viên có năm sinh khoảng từ 1995-1998) kinh nghiệm.

Mid-level được xác định từ 4-8 (ứng viên có năm sinh từ 1994 trở lên) năm kinh nghiệm.

Xác định quy trình tuyen dung it ứng viên phù hợp nhất cho doanh nghiệp

Tùy thuộc vào cách bạn sắp xếp các tiêu chí của mình sau 3 yếu tố, quy trình tiếp cận ứng viên của bạn sẽ khác nhau. Sử dụng biểu đồ dưới đây để xác định quy trình công việc phù hợp cho bạn. 

tuyen dung it
tuyen dung it

Lưu ý: Đối với các doanh nghiệp quy mô hơn, một quy trình không phải chỉ gói gọn trong 1 workflow. Đừng dừng lại ở chỉ một workflow. Hãy xác định nó cho riêng mỗi nhóm department/vị trí riêng.

Ví dụ: Nếu bạn tuyển dụng vào mùa tốt nghiệp đại học (số lượng lớn, level entry), lượng ứng tuyển chủ yếu đến từ tin đăng nội bộ (inbound). Vậy sẽ rơi vào Workflow 1.

Workflow 1

tuyen dung it
W1 – tuyen dung it

Cách hoạt động W1

Trong quy trình làm việc này, bạn gửi bài đánh giá cho ứng viên ngay khi họ nộp đơn. Bài code này sẽ tạo ra một phần drop-off (bỏ đơn) nhỏ. Nhưng trong trường hợp này thì không sao cả.

Số lượng ứng viên của bạn từ nguồn inbound cao hoàn toàn có thể giúp bạn cân bằng được. Ngay cả khi có những rủi ro xảy ra trong quy trình, bạn vẫn sẽ có rất nhiều ứng cử viên chất lượng để vượt qua phần còn lại của quy trình.

Tại sao?

Workflow này hợp lý vì nó sẽ sàng lọc ứng viên ngay từ những khâu đầu tiên.

Bằng cách đưa bài test ngay từ lúc nhận đơn, ứng viên sẽ thể hiện mức độ quan tâm – đầu tư của họ cho vị trí và công ty bạn hay không. Nó cũng giúp các ứng viên không hứng thú tự sàng lọc ngay từ những bước đầu. Các bộ phận technical không cao cũng có thể thích ứng nhanh chóng, tạo nên talent pool dễ quản lý hơn cho recruiter để gọi điện phỏng vấn. 

Workflow 2

tuyen dung it
W2 – tuyen dung it

Cách hoạt động W2

Trong trường hợp này, bài test coding sẽ được chèn vào ở giai đoạn thứ 3. Vì số lượng ứng tuyển đã ít hơn, bạn không nên chèn bài test vào ngay đầu quy trình nữa. Vì nó sẽ tạo phần drop-off (bỏ đơn) mà số lượng đơn ứng tuyển có thể không bù lại kịp thời.

Nhìn nhận dưới góc độ tích cực, việc tiến hành phone screen – phỏng vấn qua điện thoại trước giúp bạn có cái nhìn tổng quát về ứng viên trước khi yêu cầu họ tiến hành thêm các bước khác (gồm cả bài đánh giá).

Tại sao?

Tạo điều kiện bộc lộ những ưu thế về khả năng và kết nối với những người khác. Việc ưu tiên dành thời gian sẽ giúp bạn duy trí hình ảnh Nhà tuyen dung it tốt. Đồng thời duy trì mối quan hệ ứng viên trong các bước sau của quy trình.

Workflow 3

tuyen dung it
W3 – tuyen ung it

Cách hoạt động W3

Trong trường hợp này, tất cả các tiêu chí đều khá áp lực cho bạn. Bạn có khối lượng ứng viên thấp, rất ít application từ inbound và yêu cầu nhiều kinh nghiệm.

Với tình hình này, bài đánh giá năng lực nên được đưa vào bước cuối quy trình tuyen dung it, tuyển dụng Data Scientist. Đối với một ứng viên thụ động (passive candidate), nhân sự thậm chí có thể xem xét thay bài đánh giá năng lực với nhiều hình thức có tương tác khác. Bởi vì ở giai đoạn này, việc tương tác và kết nối với ứng viên cần một người có kinh nghiệm dày dặn và có insight rõ ràng. 

Tại sao?

Trong tình thế này, bạn giống như người “bán job” cho ứng viên vậy. Quan trọng là bạn có truyền tải nhiều giá trị đến họ hay không? Một hành động cc trực tiếp vào luồng mail của họ sẽ cho thấy bạn thật sự quan tâm đến họ. 

Lưu ý: Việc tuyển người cho riêng trường hợp này có nhiều thử thách. 

Tối ưu hiệu quả của bài đánh giá năng lực coding trong tuyen dung

Điều quan trọng là phải sử dụng chúng theo cách phù hợp với công ty của bạn – không có một cách tiếp cận nào áp dụng được với tất cả mọi người. Các bài coding assessment này thì không khả thi khi áp dụng chỉ 1 bài cho nhiều vị trí. Nếu xây dựng nhiều bài test phù hợp cho từng vị trí, bạn cũng sẽ phải tốn không ít thời gian và công sức để hoàn thiện được một bộ Assessment hoàn thiện và đầy đủ.

Hiện nay có không ít các đơn vị chuyên cho ra Coding Assessment ra đời, cung cấp cho bạn đa dạng các bộ challenges hỗ trợ trực tiếp cho công tác tìm kỹ sư và lập trình viên của doanh nghiệp.

tuyen dung it
Nền tảng tuyển dụng ứng viên IT

Điển hình như TopDev x HackerRankNền tảng kết hợp tuyen dung it và đánh giá ứng viên IT chuẩn quốc tế đầu tiên tại Việt Nam. TopDev x HackerRank mang lại lợi ích giải phóng Tech Lead/ Manager khỏi công việc đánh giá ứng viên; trợ giúp các HR/ IT Recruiter không có background công nghệ trong việc tuyen dung it.


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 Việc làm Developer trên TopDev

Kidsloop – Nền tảng giáo dục thông minh – Cơ hội cho các tài năng công nghệ “bùng nổ”

Kidsloop

Được thành lập năm 2011, Kidsloop là ứng dụng học tập và giải trí dành cho trẻ em, cung cấp các giải pháp công nghệ toàn diện cho nhà trường, giáo viên và phụ huynh với kho nội dung học thuật tương tác được chọn lọc kỹ lưỡng cùng những ý tưởng phong phú, giúp khơi gợi cảm hứng học tập của trẻ.

Kidsloop
Kidsloop – Nền tảng giáo dục hiện đại, giúp đem đến sự đổi mới trong cách thức tiếp cận tri thức cho trẻ

Kidsloop khởi nguồn là công ty hoạt động trong lĩnh vực giáo dục dành cho trẻ em. Trải qua gần 10 năm hình thành và phát triển, Kidsloop đã không ngừng vươn lên chiếm lĩnh thị trường, trở thành nền tảng đẳng cấp thế giới, thu hút sự quan tâm của các bậc cha mẹ trong việc giáo dục con cái trong những năm phát triển đầu đời. 

Dưới sự nghiên cứu kỹ lưỡng từ các chuyên gia về những đặc điểm nổi bật tại từng giai đoạn lứa tuổi của trẻ, Kidsloop đem đến các sản phẩm ưu việt, giúp giúp phụ huynh và giáo viên định hướng con đường phát triển tốt nhất cho trẻ trên hành trình học tập của mình.

“Cùng con làm chủ tương lai” với Kidsloop qua các tính năng đặc sắc thu hút sự quan tâm từ phụ huynh

Xây dựng thành công nền tảng giáo dục hiện đại với các tính năng: Remote, In-class và Home study, Kidsloop mang đến cho trẻ cơ hội học tập ở mọi lúc, mọi nơi, tận dụng tối đa thời gian với lộ trình cụ thể, phù hợp.

Remote là tính năng mà trong đó, giáo viên và học sinh tương tác và trải nghiệm môi trường lớp học hoàn chỉnh thông qua các thiết bị máy tính, máy tính bảng hoặc điện thoại thông minh. Với nền tảng CLMS, Kidsloop đem đến phần mềm từ xa có khả năng tương tác tiên tiến và thư viện nội dung tích hợp, tạo sự trải nghiệm tốt nhất cho trẻ trong quá trình học tập.

Tính năng In-class cung cấp cho giáo viên công cụ áp dụng công nghệ giúp tăng trải nghiệm và hiệu quả sử dụng, đem đến các nội dung trực quan ngay tại lớp học.  Thông qua màn hình tương tác, mỗi học sinh được trải nghiệm các hoạt động sáng tạo có kết thúc mở và các đánh giá sau mỗi bài học, giúp trẻ tư duy và ghi nhớ nội dung bài giảng dễ dàng.

Tính năng Home Study hướng đến môi trường học tập vui vẻ, lấy trẻ làm trung tâm và đồng thời cho phép giáo viên theo dõi tiến trình phát triển, giao bài tập về nhà cũng như đề ra các giải pháp học tập cho từng cá nhân, phù hợp với khả năng của từng trẻ thông qua thu thập dữ liệu sắc thái và phân tích cá nhân hóa. Qua đó, tương tác của người học trên nền tảng được chuyển đổi thành các đơn vị thông tin có ý nghĩa thông qua một thuật toán độc quyền, cho phép chúng tôi điều chỉnh trải nghiệm học tập của từng trẻ.

Chương trình giáo dục thú vị từ nội dung sinh động, phong phú – Điểm cộng lớn cho sự trải nghiệm của trẻ với nền tảng kiến thức mới

“Giáo dục sớm” – một thuật ngữ không còn xa lạ đối với các bậc phụ huynh thời hiện đại. Hiểu được tầm quan trọng của giáo dục từ giai đoạn 0 đến 6 tuổi, Kidsloop thành công trong việc khai thác những đặc điểm tâm lý, cũng như quá trình phát triển của trẻ trong từng giai đoạn tuổi và đưa ra lộ trình học tập phù hợp.

Chương trình giáo dục của Kidsloop nổi bật với 3 sản phẩm: Badanamu ESL, Bada Math, Bada Science. Các sản phẩm tạo nên tên tuổi của Kidsloop qua những cuộc phiêu lưu học tập vui vẻ và thú vị và quan trọng nhất là tăng mức độ tương tác. Từ hoạt ảnh 2D cổ điển đến chuỗi tương tác 3D sáng tạo, nội dung của Kidsloop mang đến niềm vui và sự ngạc nhiên khi học.

Kidsloop

Đón đầu xu hướng giáo dục mới, Kidsloop tìm kiếm nhân tài cùng góp sức, định vị giá trị của bản thân trên thị trường

Để có được sự thành công như hôm nay, Kidsloop đã không ngừng cố gắng cải tiến chất lượng với đội ngũ sáng tạo đáng kinh ngạc đến từ khắp nơi trên thế giới, bao gồm Hàn Quốc, Trung Quốc, Anh, Mỹ, Indonesia, Việt Nam, Malaysia, v.v.

Không dừng lại ở đó, hướng đến mục tiêu trở thành “kẻ dẫn đầu” trên thị trường toàn cầu,

Kidsloop liên tục mở rộng cơ hội cho các nhân tài công nghệ Việt tỏa sáng tài năng.

Kidsloop ngỏ lời chiêu mộ “chiến binh” công nghệ, những người góp sức tạo nên Kidsloop hùng mạnh, giữ vững vị trí hàng đầu trong công cuộc phát triển “hệ thống giáo dục của tương lai”.

Và nếu bạn đã sẵn sàng đồng hành cùng Kidsloop tạo nên những sản phẩm tuyệt vời nhất?

Đừng chần chờ thêm nữa, nhanh tay apply ngay hôm nay và khám phá những điều thú vị đang chờ tại Kidsloop:

  • Mức lương cạnh tranh với nhiều khoản thưởng hấp dẫn;
  • Tham gia phát triển các dự án đầy thách thức cùng đội ngũ năng động, chuyên nghiệp trong một nền văn hóa mang tính quốc tế và sẵn sàng hợp tác cùng phát triển;
  • Nhiều cơ hội phát triển chuyên môn và sự nghiệp với vai trò quan trọng trong việc định hình giai đoạn phát triển tiếp theo của công ty.

>>> Khám phá ngay những vị trí hấp dẫn tại Kidsloop cho bạn bứt phá sự nghiệp:

Lựa chọn ngay vị trí phù hợp và sẵn sàng cho những thử thách sắp đến!

Ứng tuyển ngay chờ chi!

Một design pattern trong C++ giúp bảo trì code ngon ngọt

Một design pattern trong C++ giúp bảo trì code ngon ngọt

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

Hellu! Lại là tôi đây. Trong bài trước chúng ta đã học về 1 design biến hoá việc kế thừa thành việc bao hàm. Nghĩa là mặc dù kế thừa là hay nhưng trong trường hợp đó nó lại đâm ra dở. Tách biệt chức năng không phụ thuộc lớp A vào lớp B. Khi cần thì lớp B có thể chứa lớp A và sử dụng các chức năng của nó. Design đó tôi nêu tên cho các bạn đánh index trong đầu: Strategy =))

Hôm nay chúng ta có 1 trường hợp như sau. Có 1 anh chàng. Lúc học cấp 3 anh ta chỉ cần cô ấy là gái, nói chuyện vui là yêu được.  Sau khi lên DH, anh ta sống trong cảnh xa nhà, mì tôm gặm suốt ngày. Anh ta bắt muốn yêu các cô gái có mông to đễ khoã lấp nỗi cô đơn. Rồi anh ta đi làm, anh ta kiếm được  tiền nên anh ta nâng tiêu chí người yêu là phải có ngực to nữa. Ngực to không lo chết đói =))

  1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++

  30 tiện ích Chrome cho designer và dev

Trong lập trình cũng gặp hoàn cảnh tương tự. Ban đầu khách hàng yêu cầu tính năng A, sau đó đòi thêm B, rồi C. Rồi một ngày đẹp trời nào đó, ông khách này lại muốn bỏ B đi. =)) Rất là mệt mỏi .. Vậy chúng ta phải tạo liên kết giữa các lớp một cách mềm dẻo, sao cho việc bảo trì là đơn giản nhất.

Tìm việc làm C++ nhanh chóng trên TopDev

Vậy thì các bạn thiết kế 1 lớp cha làm sao cho bon con cái kế thừa có thể cùng chung vỏ mà tính tình mỗi thằng khác nhau, tránh trường hợp đổ vỏ con nhà hàng xóm =))

Vậy đầu tiên trong lớp Mylove, các bạn cần  hàm virtual để các lớp con kế thừa như sau:

Một design pattern trong C++ giúp bảo trì code ngon ngọt

Ở đây các bạn cũng không cần virtual thuần ảo, không bắt buộc lớp con kế thừa lại hàm getDesscripttion này.

Sau đó tôi tạo thêm 1 lớp wrap lại các tính chất như mông, ngực… cho các lớp tính chất phát triển về sau:

Một design pattern trong C++ giúp bảo trì code ngon ngọt

OK, bây giờ các lớp tính chất chúng ta sẽ kế thừa từ lớp này. Ví dụ tôi làm lớp Mông trước:
Một design pattern trong C++ giúp bảo trì code ngon ngọtTrong lớp trên, hàm getDescription được kế thừa lại, mô tả lại là mông phải to. Chứ mông lép là anh này anh hổng có yêu  :3

Rồi tương tự ta làm lớp Ngực:

Một design pattern trong C++ giúp bảo trì code ngon ngọt

Và bây giờ là demo. Trong hàm main ta triển khai như sau:
Một design pattern trong C++ giúp bảo trì code ngon ngọt

Kết quả chương trình như sau:

Một design pattern trong C++ giúp bảo trì code ngon ngọt

Rồi sau đó anh ta lại nâng tiêu chí mông lên. Anh ta new 1 tính chất mới về mông:

Một design pattern trong C++ giúp bảo trì code ngon ngọt

Kết quả:

Một design pattern trong C++ giúp bảo trì code ngon ngọt

Một thời gian anh ta lại muốn ngực to =))

Code thêm như sau:

Một design pattern trong C++ giúp bảo trì code ngon ngọt

Kết quả:

Một design pattern trong C++ giúp bảo trì code ngon ngọt

Ok, vậy rõ ràng các bạn thấy việc bảo trì nâng cấp code rất đơn giản, chỉ cần tạo thêm lớp mới là ok. Đây chỉ là phần design sơ khai và cũng dễ hiểu. Cái này có tên là DECORATOR =))

Thanks đã đọc 

Full code tải tại đây

Happy =))

Bài viết gốc được đăng tải tại quynhlaptrinhc.wordpress.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

Giao tiếp Client / Server bằng gRPC

Giao tiếp Client / Server bằng gRPC

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

Hế nhô các bạn, để tiếp tục cho bài viết trước hôm nay mình xin giới thiệu với các cách giao tiếp giữa client/server với tốc độ bàn thờ, mà mình vừa mới tìm hiểu.

Trước hết gRPC theo google giới thiệu

gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.

gRPC là một RPC framework gíup bạn kết nối giữa các service trong hệ thống, nó hỗ trợ load balancing, tracing, health checking và authentication, hỗ trợ từ ứng dụng mobile, trình duyệt cho tới back-end service.

  Sử dụng ứng dụng HTTP Client của Angular v4

  Chạy ứng dụng Go trên server

gRPC sử dụng Protocol Buffer để transfer data thay vì JSON/XML truyền thống nên tốc độ được gia tăng đáng kế, ngoài ra nó cũng dùng RPC thay cho REST API, trong việc thiết kế API, sự khác biệt giữa REST API vs RPC là REST được thiết kế để tập trung vào Resource còn RPC thì tập trung vào action, hành động. Bạn có thể xem kĩ hơn ở đây.

Về cơ bản, khi làm việc với gRPC bạn định nghĩa các action, input message, output mesage trong service, sau đó protobuf compiler sẽ generate code ra file theo ngôn ngữ bạn sử dụng. Sau đó bạn sẽ triển khai các action của service như những gì đã bạn đã mô tả .

Trong bài viết này, mĩnh sẽ triển khai một User Service cho phép client thực hiện chức năng cơ bản là đăng kí và đăng nhập mình định nghĩa các message và service gồm những action như sau.

syntax  = "proto3";

package rpc;

message AccessToken{
    string access_token = 1;
}

message Credentials{
    string username = 1;
    string password = 2;
}

message LoginResult{
    bool ok = 1;
    AccessToken data = 2;
}

message FormRegister{
    string first_name = 1;
    string last_nane = 2;
    string email = 3;
    string password  =4;
    string phone_number = 5;
    string address = 6;
}

message RegisterResult{
    bool ok  = 1;
    AccessToken data = 2;
}
syntax = "proto3";

package rpc;

import "user.message.proto";

service User{
    rpc UserLogin(Credentials) returns (LoginResult){};
    rpc UserRegister(FormRegister) returns (RegisterResult){};
}

Như các bạn có thể thấy Service của mình sẽ có 2 action có thể được thực hiện là UserLogin và UserRegister, mình đã mô tả in,out message đầy đủ trong file “user.rpc.go”. Mình sẽ tiến hành biên dịch ra go file.

Để biên dịch ra go file mình dùng lệnh dưới, lênh này sẽ biên dịch tất cả các file proto trong thư mục protobuf và lưu lại trong thư mục rpc.

protoc --proto_path=protobuf  --go_out=plugins=grpc:rpc protobuf/*.proto

Mình nói qua chút về cấu trúc thư muc của project.

Giao tiếp Client / Server bằng gRPC
  • Protobuf là nơi mình lưu trữ tất cả các file .proto
  • rpc là nơi mà các file output mà đã được biên dịch
  • entity là nơi mình khai báo các action cho từng service, các action của một service sẽ nằm trong một file, ví dụ tất cả các action của user service sẽ nằm trong file user.go.
  • server tên là server nhưng nó sẽ có 2 vài trò, 1 là làm vai trò server nhận request từ nơi nào đó (A) sau đó sẽ làm vai trò là client, gọi 1 action từ gRPC server nhận kết quả sau đó trả về cho phía (A).
  • main.go đây là nơi mình khởi tạo gRPC server và đăng kí các service vào server.

Sau khi định nghĩa các action, in,out message cho từng action, mình sẽ tiến hành khai báo cụ thể các action sẽ thực hiện như thế nào, mình sẽ không đi sâu vào các action và sẽ demo đơn giản như thế này.

Giao tiếp Client / Server bằng gRPC

Như ảnh phía trênm mình định nghĩa hai chi tiết 2 action UserLogin, UserRegister sẽ được thực hiện như thế nào, hai action function này sẽ được khai báo trên struct user_service để implement interface mà ta đã định nghĩa ở trong phần khai báo trong file proto.

Giao tiếp Client / Server bằng gRPC

Trong file main.go phía trên, mình start một client cho gRPC, client này đống vai trò như là một server đối với người dùng.

Giao tiếp Client / Server bằng gRPC

Để tạo Client đối với gRPC server như hình dưới, Package RPC được compile từ proto đã có những method cho phép tạo đăng kí client cho service được miêu tả.

Giao tiếp Client / Server bằng gRPC

Client ( đối với gRPC server sẽ gọi là C1 )này sẽ lắng nghe request từ người dùng ( sẽ gọi là A) , sau đó tạo ra một message để gọi 1 action trên gRPC server, nhận response và lại trả về cho phía (A). Ví dụ khi user thực hiện đăng kí tài khoản thì C1 sẽ tạo một message từ data từ phía A dạng JSON đó ra Protobuf rồi call một action của User Service trên gRPC server sau đó nhận kết qủa và trả về cho phía A, như hình dưới.

Giao tiếp Client / Server bằng gRPC

Tiếp theo thử chạy Server và thực hiện 1 Request Register từ phía người dùng, để start bạn chạy lệnh

go run main.go
Giao tiếp Client / Server bằng gRPC

Dùng Postman để gửi request lên Server(C1).

Giao tiếp Client / Server bằng gRPC

Vậy là mình đã thực hiện được việc giao tiếp đơn giản giữa client/server (
server C1 vs gRPC server ) bằng gRPC framwork. Do mới tìm hiểu nên mình chỉ có thể viết đến đây thôi, trong tương lai, nếu có cơ hội làm việc mới gRPC thì mình sẽ học hỏi và chia sẻ với các bạn nhiều hơn, Cảm ơn các bạn đã đọc bài viết, Bye bye các bạn 😀

Source code demo :

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

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

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

Viết function trả về string là một ý tưởng tồi!

Viết function trả về string là một ý tưởng tồi!

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

Function là gì?

Function là một phần tất yếu của mọi phần mềm. Một chương trình (Python) không bắt buộc phải có function, nhưng nó là cách làm cơ bản, phổ biến nhất, tương tự như những ngôn ngữ lập trình khác. Về bản chất, function là một khái niệm / cơ chế để dùng lại code. Thay vì viết một đoạn code nhiều lần mà mỗi lần chỉ thay đổi chút chút, ta viết một function, nhận vào các tham số khác nhau.

  1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++
  5 kinh nghiệm khi viết arrow function

Đầu vào và đầu ra

Chuyện một function nhận đầu vào, xử lý và trả về đầu ra thì ai cũng biết. Phần đầu vào luôn phải được định nghĩa rõ ràng đầy đủ (trừ *args và **kwargs – thì có chúa mới biết function nhận những cái gì!), nhưng phần đầu ra thì không có quy tắc cụ thể nào. Vậy nên mới xảy ra chuyện, ai thích làm gì thì làm, và thường thì người ta sẽ làm khá tệ khi không có quy tắc nào.

Đây là một trường hợp phổ biến, hãy tưởng tượng 1 đoạn code làm nhiệm vụ CO_KHA_THI. Đầu vào dễ dàng định nghĩa những thứ ta cần cho vào, tên người dùng chẳng hạn:

def CO_KHA_THI(username):
    pass

Đầu ra là gì? chuyện này không dễ dàng thống nhất. Xét về mặt nhiệm vụ, function này chỉ có thể có 2 khả năng: thành công, hoặc thất bại. Bạn có thể tạo user, hoặc không tạo được, chấm hết. Trong nhóm chỉ có 2 kết quả trái nhau như vậy, rõ ràng boolean là ứng cử viên sáng giá, thành công: return True, thất bại return False. Nhưng nếu thất bại, bạn muốn biết lý do (user đã tồn tại, vượt quá giới hạn số lượng user, …) thì làm thế nào?

Vậy là giải pháp return string ra đời.

Return string?

Nếu thành công, return "Success", nếu thất bại vì username đã tồn tại, return "Failed user exists", nếu thất bại vì quá giới hạn, return "Failed limit exceeded", … tiếp tục như vậy với những lý do thất bại khác.

Function này làm tốt nhiệm vụ của nó, nhưng đầu ra giờ là một trời khả năng. Thay vì 2, giờ ta có N khả năng xảy ra. Thì sao?

Không sao cả, cho đến khi có ai đó gọi function này.

username = "laptrinhvien"
result = CO_KHA_THI(username)
if result == "Success":
     print("Added user {}".format(username))
elif result == "Failed limit exceeded":
...
elif result == "Failed user exists":
...
...

Người gọi function CO_KHA_THI phải biết tất cả các khả năng mà function này trả về, và cách duy nhất để làm điều đó là ngồi đọc toàn bộ code của function CO_KHA_THI. Function này có thể vài dòng, nhưng cũng có thể là vài chục dòng, vài chục câu if else… nếu việc sử dụng 1 function yêu cầu bạn phải đọc code của function đó, thì đó là một function tồi.

Ta không cần biết math.sqrt tính căn 2 như thế nào, ta chỉ cần đưa đầu vào, và sẽ thu được kết quả ở dạng số float. Ta chỉ cần đưa đường dẫn vào requests.get và nhận kết quả của HTTP GET requests đó, không cần biết nó làm thế nào.

Xử lý lỗi

Khi lỗi xảy ra thì sao?

Mỗi ngôn ngữ lập trình có cách xử lý lỗi khác nhau – khái niệm này gói chung vào từ khóa “error handling”.

Chuyện gì xảy ra khi lấy căn bậc 2 của -2? Python sẽ “raise” (tung ra) một Exception object:

In [2]: math.sqrt(-2)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-750cdbc9cc40> in <module>()
----> 1 math.sqrt(-2)

ValueError: math domain error

Ta dùng try/except để xử lý khi có exception xảy ra.

Golang sử dụng cơ chế khác: một function thường trả về lỗi, và kết quả. Nếu không có lỗi, giá trị lỗi là nil (tương đương None của Python). Việc gọi 1 function trong Golang thường trông như sau:

ok, value = call_function(arg1, arg2)
if ok != nil {
   Xử  lỗi xảy ra dựa trên giá trị cụ thể của ok
} else {
   Tiếp tục xử  value thu được.
}

Mỗi cách làm sẽ có ưu nhược điểm khác nhau. Trong Python, ta có thể làm tương tự như Golang, với ví dụ function CO_KHA_THI, return 1 tuple chứa boolean chỉ định việc thành công hay thất bại, và string chứa thông điệp muốn gửi tới người dùng là một cách làm tốt hơn chỉ trả về string. Người dùng có thể không quan tâm đến lỗi gì, vậy khi đó chỉ cần xử lý dựa trên giá trị boolean. Nếu quan tâm đến lỗi, lúc đó lại phải dựa vào giá trị string. Mà dựa vào string lại khiến vấn đề quay lại từ đầu. Liệu nội dung lỗi là string chữ thường hay chữ hoa? liệu sau này nội dung string đó có bị thay đổi không, nếu có làm sao ta biết? (đọc lại function?!?!!!).

Tạo các exception và raise khi có lỗi là cách làm đơn giản hơn cả. Exception có kiểu, là các class có kế thừa, dễ dàng phân loại các lớp lỗi khác nhau mà không dựa vào string.

class MyException(Exception): pass
class MyFirstException(MyException): pass
class MySecondException(MyException): pass

def do_something(username):
    result = do_job()
    if error1 in result:
        raise MyFirstException(error1)
    elif error2 in result:
        raise MySecondException(error2)
    ...
    else:
        raise MyException("Unknown error: %s" % error_msg)

try:
    do_something('pymi')
except MyFirstException as e:
    print('Failed with error1', e)
except MySecondException as e:
    print('Failed with error2', e)
except MyException as e:
    print('Failed with error not 1 and 2', e)
else:
    print('Success')

Dù dùng cách nào đi nữa, đừng chỉ trả về string – trừ khi function được tạo ra để xử lý string.

Bài viết gốc được đăng tải tại pymi.vn
Có thể bạn quan tâm:
Xem thêm Việc làm Developer hấp dẫn trên TopDev

Hướng dẫn sử dụng JMeter test hiệu năng website – Phần 2

Sử dụng jmeter test hiệu năng website

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

Performance testing là một loại test quan trọng để xác định ứng dụng web đang được kiểm tra có đáp ứng các yêu cầu tải cao hay không. Loại test này được dùng để phân tích hiệu năng máy chủ một cách tổng thể khi chịu tải nặng.
Ở bài viết trước, mình đã giới thiệu tới các bạn các thành phần cơ bản và cốt lõi của Jmeter cũng như cách sử dụng chúng. Các bạn có thể xem lại ở Đây.

  Biện hộ: Vì sao các Developer không test phần mềm của họ?
  15 thư viện slider jquery miễn phí cho dự án website của bạn

Mình xin nhắc lại chuỗi bài viết của mình gồm 4 phần sau:
Phần 1: Giới thiệu và cài đặt
Phần 2: Hướng dẫn xây dựng kịch bản test
Phần 3: Sử dụng Regular Expressions làm việc với Session IDs và Tokens
Phần 4: Mở rộng – Tạo lập Scripts tự động bằng HTTP(S) Test Script Recorder.
Trong bài viết này, chúng ta sẽ cùng nhau xây dựng 1 kịch bản test đầy đủ từ việc lên ý tưởng cho tới triển khai và đánh giá kết quả.

Các bước xây dựng kịch bản test

  • Bước 1: Phân tích yêu cầu
  • Bước 2: Tạo lập Scripts test
  • Bước 3: Thiết lập kịch bản test
  • Bước 4: Thưc thi kịch bản test
  • Bước 5: Đánh giá kết quả test

Bước 1: Phân tích yêu cầu

Đây là bước lên ý tưởng, kịch bản test sẽ thực hiện. Trước khi thực hiện test ta cần định nghĩa rõ ràng các thông tin sau:

  • Mục tiêu test là gì? Bạn cần xác định được kết quả mong muốn sau khi kiểm thử hiểu năng là gì. Kiểm tra giới hạn chịu tải của hệ thống (Stress testing) hay theo dõi diễn biến của hệ thống khi có nhiều người cùng truy cập (Load testing)
  • Số lượng user sẽ giả lập? Cho dù mục tiêu của bạn là gì, thì việc không thể thay đổi đó là ta sẽ mô phỏng 1 số lượng người dùng thao tác trên hệ thống. Vậy số lượng này là bao nhiêu, hoàn toàn tùy thuộc vào nhu cầu sử dụng hệ thống của bạn, hoặc cũng là yêu cầu từ phía đối tác. Có hệ thống đòi hỏi đáp ứng hàng chục ngàn lượt truy cập cùng lúc tuy nhiên 1 số hệ thống lại chỉ cần đáp ứng lượng truy cập ít hơn mà vẫn hoạt động ổn định.
  • Work follow sẽ test? Mỗi hệ thống sẽ có các chức năng khác nhau, nghiệp vụ khác nhau. Do đó bạn cần tự định nghĩa được kịch bản sử dụng của người dùng khi họ truy cập hệ thống của mình là gì. Từ đó sẽ tiến hành tạo lập script test theo flow đó.
  • Kết quả đầu ra yêu cầu?

VD: Kiểm tra hiệu năng của hệ thống với 1000 user với luồng thao tác sau: Đăng nhập sau đó Đăng xuất.
Mục tiêu: Tìm ra khoảng thời gian đáp ứng chạy tốt của hệ thống khi 1000 user cùng thao tác liên tục. Tức là hệ thống cần đảm bảo 1000 user truy cập trong X phút. Tỉ lệ request lỗi 0%. Tìm X?
Số lượng user: 1000. Lặp lại: 1 lần. Thời gian: X phút.
Work follow: Truy cập trang login -> Ấn nút Đăng nhập -> Truy cập trang chủ -> Ấn nút Đăng xuất.
Kết quả đầu ra yêu cầu: tỉ lệ lỗi 0%, thời gian phản hồi trung bình < 10 000 ms.

Bước 2: Tạo lập Scripts test

Dựa vào kế hoạch test bên trên, ta sẽ đi tạo lập các script tương ứng cho từng action. Để giả lập truy cập của người dùng trên hệ thống.
Trong ví dụ bên trên thì ta sẽ cần tạo 4 Http request như sau:

  • Truy cập trang login
  • Logic check login
  • Truy cập trang chủ
  • Logic logout

Chi tiết các bước như sau:

  • Tạo thread group: Quy định 1000 user truy cập trong 600s (10 phút). Ở đây giả định X cần tìm là 600s. Sau khi phân tích kết quả test. Ta sẽ đánh giá xem X như vậy đã đáp ứng được yêu cầu chưa?
Hướng dẫn sử dụng JMeter test hiệu năng website – Phần 2
Tạo Thread Group
  • Thêm Http request default, Http cookie manager.
  • Thêm request truy cập trang login:
Hướng dẫn sử dụng JMeter test hiệu năng website – Phần 2
Url truy cập trang login
  • Request check login: Thực hiện cấu hình parameter + file chứa thông tin tài khoản của user như giới thiệu ở Phần 1.
Hướng dẫn sử dụng JMeter test hiệu năng website – Phần 2
Cấu hình parameter và Url check Login.
Hướng dẫn sử dụng JMeter test hiệu năng website – Phần 2
Load file CSV config dữ liệu 1000 tài khoản.

Để biết logic check login truy cập vào url nào và paramater gửi lên như thế nào. Ta thực hiện Login vào hệ thống từ trình duyệt web. Sau đó sử dụng Developer tool (F12) để phân tích dữ liệu. Hoặc đơn giản hơn, hãy yêu cầu team phát triển hệ thống cung cấp giúp bạn logic của việc kiểm tra login này, để bạn tạo lập script chính xác hơn. Ở đây mình đang thực hiện 1 ví dụ minh họa để bạn hiểu được cách thức thực hiện. Chúng ta cùng sang bước tiếp theo.

  • Request vào trang chủ: /home
Hướng dẫn sử dụng JMeter test hiệu năng website – Phần 2
  • Request logout: /login/logout
Hướng dẫn sử dụng JMeter test hiệu năng website – Phần 2
  • Thêm listener để theo dõi kết quả
Hướng dẫn sử dụng JMeter test hiệu năng website – Phần 2

Như vậy là ta đã hoàn thiện xong script giả lập các thao tác của người dùng trên hệ thống. Việc tiếp theo chúng ta sẽ thay đổi tham số của Thread group và tiến hành test, theo dõi kết quả.

Bước 3: Thiết lập kịch bản test

Ở bước này, trước khi test ta cần đề ra các kịch bản test và kết quả đầu ra mong muốn của hệ thống.
VD:
– Kịch bản 1: 1000 user test liên tục trong 10 phút. Yêu cầu hệ thống phản hồi < 1000 ms. Tỉ lệ lỗi 0 %.
– Kịch bản 2: 2000 user test liên tục trong 10 phút. Yêu cầu hệ thống phản hồi < 3000 ms. Tỉ lệ lỗi < 1%.

Bước 4: Thưc thi kịch bản test

Để bắt đầu chạy test, ấn nút Start và theo dõi các report trên giao diện

Hướng dẫn sử dụng JMeter test hiệu năng website – Phần 2

Bước 5: Đánh giá kết quả test

Theo dõi kết quả test và đưa ra các điều chỉnh phù hợp cho Thread Group để tiến hành test các trường hợp khác cho tới khi tìm được đầu ra mong muốn. Để xem lại chi tiết ý nghĩa các Report. Xem lại Hướng dẫn sử dụng Jmeter test hiệu năng website – Phần 1.

Như vậy mình đã hướng dẫn các bạn các bước để thực hiện 1 kịch bản test một cách cơ bản nhất. Trong quá trình áp dụng thực tế, sẽ có các vấn đề cần lưu ý tùy thuộc vào công nghệ bạn tạo ra hệ thống của mình. Mình sẽ chia sẻ thêm phần này ở bài viết sau nhé.

Mọi người có ý kiến trao đổi gì thì comment bên dưới nhé!

Tham khảo

https://jmeter.apache.org/usermanual/component_reference.html

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

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

freelancer IT
freelancer IT

Tư duy phản biện là một kỹ năng quan trọng trong ngành Nhân sự. Việc tuyển dung freelancer it hay bất cứ vị trí nào đều đòi hỏi các kỹ năng đặc biệt. Dưới đây là list 5 cuốn sách TopDev đã tổng hợp.

Cẩm nang tư duy phản biện: Khái niệm và công cụ

Cuốn sách này Là 1 trong 6 tài liệu quan trọng thuộc bộ sách tư duy. Với 46 trang sách, bạn đọc sẽ biết thêm nhiều điều tú vị về tư duy phản biện. Đối với các ứng viên freelancer IT, Junior, Senior, tuyển dụng Data Scientist… đều có thể áp dụng các quy tắc được hệ thiết lập và hệ thống hóa.

Tất nhiên, đây không phải là một tác phẩm dễ ngấm. Sách tư duy về kỹ năng đòi hỏi người tiếp thu phải chủ động, sáng tạo trong việc tìm tòi; sẵn sàng đặt ra các thắc mắc.

Điều này có ý nghĩa quan trọng đối với thông điệp chính của sách. Đó là dẫn dắt và mang lại giá trị thông qua sự liên kết và thực hiện hành vi thực tiễn.

freelancer IT
Cẩm nang tư duy phản biện: Khái niệm và công cụ

Tư duy nhanh và chậm

Nếu là một ứng viên trẻ, thì đây là cuốn sách lý tưởng dành cho bạn. Hãy thử đọc nó để cảm nhận các giá trị mà nó mang lại. đơn xin nghỉ việc

Cuốn sách nói về tính hợp lý và phi lý của con người trong tư duy. 2 phần như hai khía cạnh đối lập. Song nó phụ ứng lẫn nhau để giúp cho khả năng tuy duy được linh động hơn.

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

Khi đọc nó, các freelancer IT sẽ biết thế nào là tư duy cảm tính – tư duy khách quan; tính tự động; năng lực điều tiết cảm xúc và giới hạn của những khuôn mẫu,… Đó đều là những cơ sở logic quan trọng giúp bạn phát triển lối tư duy này.

freelancer IT
Tư duy nhanh và chậm

Lối mòn của tư duy cảm tính

Cuốn sách này thu hút độc giả bởi những lời cảnh báo đầy sắc nét. Khi tận hưởng những nội dung, bạn sẽ nhận ra các quyết định của mình liệu có cơ sở, có sự ảnh hưởng như thế nào đến sự phát triển bản thân trong tương lai.

Đồng thời, cuốn sách đã giải thích, phân tích các hành vi thực tế nhằm đi đến các kết luận về các giải pháp khoa học giúp hạn chế sự tác động tiêu cực của lối tư duy này. Đây được xem là một điều hết sức quan trọng.

freelancer IT
Lối mòn của tư duy cảm tính

Critical Thinking: Tools for Taking Charge of Your Professional and Personal Life

Tạm dịch: Tư duy phản biện – Công cụ để đảm đương công việc và cuộc sống

Với cuốn sách này, các ứng viên freelancer it sẽ nắm được cách thức sử dụng hiệu quả và phát triển khả năng tư duy phản biện. Chính điều này sẽ giúp khám phá những cơ hội, giảm thiểu những quyết định sai nhằm đạt được những mục tiêu lớn của cuộc đời.

Cuốn sách khuyến khích bạn đặt ra các giả thuyết. Từ đó, quy chiếu đến hiện thực để đi đến các quyết định quan trọng. Đưa ra các quyết định đúng đắn sẽ khiến bạn trở nên tự tin hơn trong các thời khắc quan trọng của sự nghiệp.

freelancer IT
Tư duy phản biện: Công cụ để đảm đương công việc và cuộc sống

Asking the right questions: A guide to critical thinking

Tạm dịch là Đặt câu hỏi đúng – Dẫn lối tư duy phản biện

Khi đọc quyển sách này, nhiều ứng viên freelancer it, senior sẽ hiểu được nguyên tắc đầu tiên của tư duy phản biện là biết đặt câu hỏi đúng. Một câu hỏi đúng phải thật sự được định hướng đúng trọng tâm của vấn đề.

Cuốn sách khai thác các khía cạnh khác nhau của lập luận (vấn đề, kết luận, lý do, bằng chứng, giả định, ngôn ngữ) và cách phát hiện các sai sót; trở ngại đối với lối tư duy này trong cả giao tiếp bằng văn bản và thị giác.

freelancer IT
Đặt câu hỏi đúng – Dẫn lối tư duy phản biện

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

Xem thêm việc làm Developers hàng đầu tại TopDev

Làm sao phát hành thành công một sản phẩm ở vị trí Product Manager?

product manager là gì
Làm sao phát hành thành công một sản phẩm ở vị trí Product Manager?

Tác giả: Dr. Nancy Li

Đây là câu hỏi chắc chắn sẽ xuất hiện trong bất cứ cuộc phỏng vấn nào liên quan đến Product Manager tuyển dụng. Những người phỏng vấn sẽ hỏi bạn rằng “Hãy cho biết lúc nào là thời điểm bạn quyết định chuyển từ các biểu mẫu dữ liệu sang thực thi xây dựng sản phẩm?” Bài viết dưới đây của tôi sẽ chia sẻ với bạn cách trả lời hợp lý nhất, dựa trên kinh nghiệm phỏng vấn hơn 100 ứng viên cũng như bài học tôi rút ra từ những thất bại của mình.

product manager
Ứng viên cho vị trí PM đối mặt với nhiều câu hỏi khá khó

Product Manager là gì? Lý do thật sự đằng sau câu hỏi này

Hiểu được ngọn nguồn vấn đề giúp bạn giải quyết câu hỏi tốt hơn. Mục đích của câu hỏi này có hai ý chính:

Bạn đã từng làm công việc Product Management trước đây chưa?

Tức là bạn đã có kinh nghiệm làm việc nào liên quan đến vị trí này trước đây chưa. Thông qua cách bạn trình bày sự hiểu biết của mình với khái niệm Product Manager là gì, công việc của Product Manager ra sao,… giám khảo có thể hiểu được phần nào khả năng của bạn.

Bạn đã sử dụng những phương pháp hiện đại để phát hành sản phẩm bao giờ chưa?

Bạn có biết về các loại biểu đồ hay quy trình làm việc nhanh chưa? Ở thời điểm hiện tại, khi phỏng vấn vị trí Product Manager, nhà tuyển dụng muốn tìm hiểu cách làm việc với công nghệ hiện đại mà bạn áp dụng trong việc quản lý sản phẩm của mình.

Do đó bạn cần đảm bảo mình phải trả lời đúng framework để ghi điểm!

  "Dân làm Product khác hoàn toàn 180 độ với dân làm outsourcing"
  Bí kíp để trở thành một Product Manager giỏi

Làm thế nào để trả lời theo chuẩn framework?

Nghiên cứu thị trường đối với Product Manager là gì?

Cách nghiên cứu thị trường của Product Manager là gì? Lấy ví dụ, khi tôi tiến hành làm việc cho sản phẩm về mô hình thành phố thông minh, tôi sẽ bắt đầu bằng cách nghiên cứu thị trường để hiểu khách hàng muốn gì, đối thủ của mình trong thị trường này ai, có những giải pháp thay thế nào,… Thực chất mà nhà tuyển dụng muốn khai thác ở bạn, chính là bạn có thể tìm kiếm được những gì từ thị trường.

Bên cạnh đó, bạn phải đảm bảo là mình đã hỏi khách hàng về quan điểm của họ, hiểu rõ ràng và cặn kẽ yêu cầu của họ. Xác định được tiếng nói của khách hàng trong việc xây dựng phương án cho sản phẩm.

Product Manager tuyển dụng
Một PM cần dành nhiều thời gian để nghiên cứu thị trường

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

MVP (Minimal Viable Product)

Thứ hai là tiến trình MVP (Minimal Viable Product), khi nhắc đến MVP bạn cần phải chắc chắn rằng mình đã đưa ra ý tưởng chuyển đổi được thực hiện thông qua nghiên cứu thị trường. Tôi phát hiện rằng thành phố mình vẫn chưa có công nghệ đúng đắn để áp dụng cho việc giảm các vụ tai nạn xe hơi nên tôi đề xuất giải pháp A, B, C,… Và khi tôi làm việc với các kỹ sư trong công ty chúng tôi đã nảy ra ý tưởng về MVP, một phiên bản mới của MVP.

Bạn nên giải thích với khách hàng rằng phiên bản đầu tiên của MVP sẽ thu thập các data của thành phố với những chức năng a, b, c. Mô tả một cách thật sự đơn giản về MVP của bạn trong một câu. Sau đó giải thích cách bạn phát triển MVP này như thế nào. Khi nói về MMP, bạn nên nói với họ rằng bạn đã từng làm việc với một team dev, UI UX design và sẽ phản hồi lại thông tin cho khách hàng. Tất cả thông tin sẽ được lặp đi lặp lại như vậy.

Sản phẩm của Product Manager là gì sau khi chuẩn bị phát hành

Thứ 3, ứng viên cho vị trí Product Manager cần phải nói về sản phẩm sắp phát hành. Khi bước vào giai đoạn này, bạn cần phải đi vào chi tiết vấn đề liên quan đến việc bạn và team sẽ tung sản phẩm ra thị trường như thế nào, bạn sẽ làm việc với ai, chiến lược marketing mà bạn hướng đến là gì. Và tất cả tựu trung lại trong từ khóa, những gì người phỏng vấn đang tìm kiếm.

Kết luận

Điều duy nhất mà tôi muốn nhắc các bạn là đừng bao giờ tham lam kể quá nhiều các chi tiết trong mỗi gạch đầu dòng phía trên. Bạn chỉ nên mô tả mọi thứ trong khoảng 1, 2 câu với mỗi bước. Và cuối cùng bạn cần có khẳng định được kết quả rằng, trong vòng nửa năm làm việc tại công ty, bạn có thể cho phát hành một sản phẩm, đạt được doanh thu 100 triệu hay thu hút thêm 100 khách hàng sử dụng nó.

Kết thúc một cách mạnh mẽ bằng cách trình bày được những ảnh hưởng của bạn lên sản phẩm, đó là cách để bạn gây ấn tượng với nhà tuyển dụng. Trên đây chính là cách để bạn trả lời tốt nhất những câu hỏi liên quan đến vị trí PM, nhất là khi ứng tuyển vào các công ty đòi hỏi chuyên môn cao như KMS Technology tuyển dụng

  Bài viết được transcript từ video gốc

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

Xem thêm các vị trí việc làm IT hấp dẫn tại TopDev

Tại sao dùng Vue.js

Tại sao dùng Vue.js

Tại sao dùng Vue.js

Khi bạn đọc được bài viết này, tôi tin rằng bạn là một người may mắn, đơn giản là vì dưới đây tôi sẽ giới thiệu đến cho bạn một javascript framework có tên là Vue.js đang phát triển chóng mặt dù mới chỉ xuất hiện lần đầu vào năm 2014 với phiên bản Vue.js 1.0. Vue.js phát triển nóng hơn khi phát hành phiên bản Vue.js 2.0 vào tháng 10/2016. Với 51k đánh giá Vue.js trên Github, gấp đôi số lượng sao có được từ Angular, Vue.js thật sự đang có những bước phát triển vượt bậc. Tại sao Vue.js đạt được thành tựu lớn trong một thời gian ngắn như vậy, những nguyên nhân đó sẽ nói lên tại sao bạn may mắn khi biết đến Vue.

  10 kinh nghiệm khi làm việc với các dự án lớn viết bằng Vue.js
  3 phút làm quen với Vue.js

Vue.js tích hợp những tính năng tốt nhất

Vue.js là framework chịu học hỏi những gì tốt nhất từ các hệ thống khác, nó cũng giống như Laravel một PHP framework có độ phủ lớn nhất hiện nay, cả hai framework này đều sàng lọc những tính năng, cách thức thiết kế tốt nhất từ các framework đối thủ. Cũng chính vì vậy, Laravel cũng giới thiệu Vue.js như là một javascript framework nên dùng khi xây dựng hệ thống. Sự kết hợp các tính năng được học hỏi này tạo nên một framework không tưởng, “thật vi diệu” – tôi tin đấy là câu nói của bất kỳ ai khi tìm hiểu các tính năng của Vue.

Xây dựng dựa trên các Component là ý tưởng chính của Vue.js

Vue.js Component giúp module hóa trong việc lập trình HTML, Javascript, CSS, tạo ra các khối giao diện người dùng có thể tái sử dụng. Component vi diệu hơn các đối tượng ở chỗ nó có thể được sử dụng lại trong các template như là một phần tử HTML.

React chính là nguồn cảm hứng chính của Vue.js về ý tưởng component, đôi khi có thể bạn còn cảm thấy Vue.js lấy cảm hứng từ cả Polymer hay Web component. Tôi nghiêng về React hơn bởi Polymer được thiết kế để tạo ra các thành phần riêng mà có thể sử dụng trực tiếp trong HTML, trong khi đó React và Vue.js sử dụng component chỉ ở trong các template, sử dụng các render engine và bộ biên dịch template tạo ra các mã HTML với các thành phần đã biết. Thật sự mà nói cũng không thể biết được là ai lấy ý tưởng của ai nhưng chúng ta cảm nhận thấy có những tính năng rất hay từ các hệ thống được kế thừa vào những anh lính mới.

Chỉ thị – lệnh trong Vue.js

Vue.js Directive – tạm dịch là các chỉ thị hay các thành phần câu lệnh trong Vue.js giúp render engine hiểu được phải làm gì? Các chỉ thị này điều khiển luồng thực hiện và thao tác với DOM (Document Object Model) giúp xây dựng các mẫu, chỉ thị giống như thuộc tính trong các thành phần HTML.

<ul id="example-1">
  <li v-for="item in items">
    {{ item.message }}
  </li>
</ul>

v-for là một thuộc tính chỉ thị lặp qua các phần tử của items để hiển thị message của chúng trong các phần tử <li>. Angular cũng làm một điều tương tự như vậy:

<ul id="example-1">
  <li ng-repeat="item in items">
    {{ item.message }}
  </li>
</ul>

Với cách thức này “học hỏi” được từ Angular, các đoạn mã dễ dàng đọc và viết hơn khi sử dụng trộn lẫn giữa các mã Html và Javascript.

Kiến trúc Component trong các file riêng

Vue.js không phải là nguồn gốc của ý tưởng tạo ra các Component trên các file riêng biệt, Polymer và Web Component mới là những người đi đầu xây dựng kiến trúc này. Một ví dụ trên trang chủ của Polymer nói lên điều đó:

<dom-module id="contact-card">
  <style>...</style>
  <template>
    <content></content>
    <iron-icon icon="star" hidden$="{{!starred}}"></iron-icon>
  </template>
  <script>
    Polymer({
      is: 'contact-card',
      properties: {
        starred: Boolean
      }
    });
  </script>
</dom-module>

Vue.js không chỉ có vậy mà còn đi xa hơn các đàn anh của mình với việc hỗ trợ các ngôn ngữ tiền xử lý khác thay thế cho CSS (như Sass, Less, Stylus hay CSS Module), HTML(như Pub) và Javascript như TypeScript, CoffeeScrip. Tích hợp tất cả các ngôn ngữ và công nghệ vào một file giúp tạo ra một framework có những tính năng tuyệt vời.

Core Vue.js với tính năng tối thiểu

Vue.js chỉ tập trung vào việc render giao diện người dùng và các tương tác, nó cung cấp tối thiểu các tính năng cần thiết cho thiết kế và xây dựng kiến trúc. Về mục tiêu phát triển này, Vue.js cũng rất tương đồng với React, cả hai framework để các thư viện khác đảm nhận các công việc mở rộng như định tuyến, quản lý trạng thái tập trung… Chính bằng cách loại bỏ các tính năng không cần thiết ra khỏi thư viện lõi trong Vue.js, giúp cho framework này rất nhỏ gọn và mềm dẻo.

Lời kết

Chỉ một năm nữa, khi chúng ta quay lại bài viết này, Vue.js sẽ ở một đỉnh rất cao, tôi tin là như vậy, bởi cũng chính cách thức này mà Laravel hiện đang đứng đầu trong các PHP framework. Chúng ta cũng không lấy gì làm ngạc nhiên bởi những gì ưu việt nhất của các đối thủ, đã được Vue.js học tập, triển khai, không những thế còn phát triển xa hơn các đàn anh của mình.

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

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

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

Hướng dẫn sử dụng JMeter test hiệu năng website – Phần 1

Sử dụng JMeter test hiệu năng

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

Performance testing là một loại test quan trọng để xác định ứng dụng web đang được kiểm tra có đáp ứng các yêu cầu tải cao hay không. Loại test này được dùng để phân tích hiệu năng máy chủ một cách tổng thể khi chịu tải nặng.

Chuỗi bài viết này mình sẽ giới thiệu tới các bạn 1 công cụ test rất mạnh mẽ và phổ biến hiện nay: Apache Jmeter

  04 Điều Cần Chú Ý Cho Người Mới Làm Automation Test
  3 tools giúp bạn tăng hiệu năng của React App một cách bất ngờ

Cụm bài viết của mình gồm các phần từ bắt đầu cho tới nâng cao:
Phần 1: Giới thiệu và cài đặt
Phần 2: Hướng dẫn xây dựng kịch bản test
Phần 3: Sử dụng Regular Expressions làm việc với Session IDs và Tokens
Phần 4: Mở rộng – Tạo lập Scripts tự động bằng HTTP(S) Test Script Recorder.

Jmeter có thể làm gì?

Jmeter là công cụ giúp ta giả lập thao tác của người dùng trên web. Bằng việc giả lập các thao tác của một số lượng người dùng nhất định, Jmeter giúp ta đánh giá được các kết quả:
– Web có thể chịu được bao nhiêu lượt truy cập/thao tác liên tục cùng lúc?
– Để đáp ứng số lượng X người sử dụng, thì cần phân phối họ truy cập trong bao lâu? Như thế nào để Web vẫn hoạt động bình thường?
– Thời gian response dữ liệu của server với từng mức tải người dùng?
– Kết hợp với 1 số tool monitor server, ta có thể theo dõi thay đổi vật lý của server khi có tải lớn như: CPU, RAM, Network traffic… (Phần này mình sẽ có bài viết khác giới thiệu về các tool monitor – Link đang cập nhật)

Cài đặt và khởi chạy Jmeter

B1: Các bạn Download Apache Jmeter mới nhất tại Đây.
B2: Để chạy được Jmeter, bạn cần cài thêm JDK của Java nữa, download tại Đây
B3: Chạy JDK
B4: Chạy Jmeter: Sau khi download Jmeter, các bạn giải nén và chạy file .jar trong thư mục /bin

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1

Hình 1: Khởi chạy Jmeter

Giới thiệu các thành phần trong Jmeter

Các bạn vui lòng đọc kĩ phần này, trước khi bắt tay vào test hiệu năng 1 cách nghiêm túc. Chúng ta cần hiểu và nắm được ý nghĩa của các thành phần trong Jmeter. Tất nhiên nếu đơn giản bạn chỉ muốn test lượt truy cập vào website của bạn mà không mô phỏng thao tác nào của họ trên đó thì có thể bỏ qua phần này.
Trong phần này chúng ta sẽ tìm hiểu các thành phần sau:

  • Thread Group
  • Controller (Sampler Controller & Logic Controller)
  • Configuration Element
  • Listener
  • Timer

Thread Group

Tạo 1 thread group: TestPlan > Add > Threads (Users) > Thread group

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1
Hình 2: Tạo thread group

Một Thread Group đại diện cho một nhóm người dùng, và nó chứa tất cả những yếu tố khác.Mỗi Thread Group sẽ mô phỏng những người dùng để thực hiện một trường hợp thử nghiệm cụ thể. Thread Group cho phép tester thực hiện những tùy chỉnh về:

  • Số lượng Thread: Mỗi Thread đại diện cho một người dùng ảo, JMeter cho phép thay đổi số lượng người dùng không hạn chế để thực hiện các thử nghiệm.
  • Ram-Up Period: Thời gian để bắt đầu tất cả những Thread.
  • Loop Count: Số lần lặp lại những yêu cầu của người dùng. Ngoài ra còn có những tùy chọn khác như việc chạy các Thread vào lịch biểu định sẵn, xác định hành động sẽ thực hiện khi xảy ra lỗi…

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1
Hình 3: Các thành phần của Thread Group

VD: Number of Threads: 100, Ram-Up Period: 100, Loop Count: 1. Tức là Jmeter sẽ giả lập thao tác cho 100 user thực hiện trong 600s, tức là mỗi user sẽ tiến hành thực hiện cách nhau 1s (100s/100) và lặp lại 1 lần.

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1

Chú ý: 100 user + Loop count: 1 khác gì 50 user + Loop count 2.
Về tổng số request thì bằng nhau, Jmeter sẽ thực hiện 100 lượt test.
Tuy nhiên có sự khác nhau về thứ tự thực hiện của các user như sau:

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1

Controller: HTTP Request Defaults

Tạo HTTP Request Defaults: Add > Config Element > HTTP Request Defaults.
HTTP Request Defaults: Định nghĩa trang web mà mình sẽ thực hiện xuyên suốt kịch bản test. 1 kịch bản test có thể có nhiều Http request khác nhau ở các URI (Path) khác nhau, nhưng đều xuất phát ở cùng 1 domain được định nghĩa ở HTTP Request Defaults.
Trong bảng HTTP Request Defaults, hãy nhập tên trang web cần được kiểm tra ( http://www.google.com ), port Number: 80 (Hầu hết các http request trả về dữ liệu qua cổng 80)

Http request: Định nghĩa 1 request mô phỏng cho 1 chức năng/thao tác của user trên hệ thống.
Để thêm mới Http request: Add -> Sampler -> HTTP Request.

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1

Trong Bảng HTTP Request, trường Path cho biết yêu cầu URL nào bạn muốn gửi tới server. Nếu bạn để trống trường này, request sẽ được gửi tới URL: google.com (Đã được config trước đó ở http request default)
Ở đây ta còn có thể định nghĩa phương thức truy cập tới URL trên gồm: GET/POST/HEAD/PUT/DELETE/….
Phổ biến nhất hay dùng là GET/POST.
Để truyền thêm param cho request, ấn nút Add.

Configuration Element

  • HTTP Cookie Manager: Hầu hết các trang web đều sử dụng cookie để lưu dữ liệu. Do đó, cần thêm element này để có thể lưu dữ liệu của user sau khi thực hiện controller login.
  • CSV Data Set Config: Dùng để quy định file dữ liệu đầu vào cho kịch bản test với nhiều người dùng khác nhau cùng sử dụng 1 chức năng.
    VD: Kịch bản test: 100 user login vào hệ thống sử dụng 100 tài khoản khác nhau. Danh sách username, password của 100 tài khoản đó sẽ được lưu trong file csv_account.txt. Jmeter sẽ đọc dữ liệu từ file này và lần lượt gửi dữ liệu vào mỗi request.

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1
Mẫu file csv_account.txt

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1
Giải thích CSV data

Filename: đường dẫn tới file dữ liệu
Varible names: Tên các biến mình định nghĩa, theo thứ tự dữ liệu từ trái qua phải
Delimiter: Kí tự dùng để phân cách giá trị các biến.
Theo như file csv_account.txt bên trên thì mình định nghĩa format dữ liệu sẽ là: username, password.
Để sử dụng các giá trị từ file dữ liệu đưa vào http request, cấu hình như sau:

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1

Tại cột value, ta sử dụng các biến đã định nghĩa bên trên. Chú ý cú pháp sử dụng là: ${ten_bien}

Listener

Công cụ Listener mà JMeter cung cấp cho phép xem những kết quả thu được từ việc chạy thử nghiệm dưới các dạng khác nhau như: đồ thị, bảng biểu, cây.. Các listeners sẽ cung cấp một cách trực quan nhất những dữ liệu thu thập được từ việc thực thi các Test case. Tester cũng sẽ có thể tùy chỉnh những thông tin mà Listener trả về một cách dễ dàng bởi các tính năng trong giao diện cụ thể của từng Listener. Có rất nhiều dạng Listener được JMeter cung cấp, có thể kể đến một số Listener thường được sử dụng để cung cấp như:

  • Summary report: báo cáo tóm tắt kết quả thực hiện test.
  • View Results Tree: Báo cáo chi tiết kết quả thực hiện của từng request. Tại đây ta có thể xem lại dữ liệu request đó đã gửi đi, và dữ liệu nhận được từ phía server.
  • View Results in Table: Chi tiết kết quả thực hiện từng request ở dạng bảng. (Chi tiết của dạng summary report)
  • Graph Results: Biểu đồ thống kê thời gian phản hồi và các tham số sau mỗi request được gửi đi.

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1
Summary Report

Label: Tên http request
Sample: số lượng request đã thực hiện
Avarage: Thời gian phản hồi trung bình. Đơn vị ms.
Min: Thời gian phản hồi ngắn nhất;
Max: Thời gian phản hồi lâu nhất
Std. Dev: Độ lêch chuẩn thời gian phản hồi
Error %: Tỉ lệ % số request bị lỗi (Không nhận được phản hồi từ server).
Throughput: Số request server có thể xử lý/ second/minute/hour.
Received KB/sec: Thông lượng KB nhận được/giây
Sent KB/sec: Thông lượng KB gửi đi/giây
Avg. Bytes: Dữ liệu phản hồi trung bình

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1
View Results Tree

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1
View Results In Table

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1
Graph Results

Ở dưới cùng của hình ảnh, có các số liệu thống kê sau đây, được biểu thị bằng màu sắc:
• Đen: Tổng số mẫu hiện tại được gửi – 100.
• Màu xanh dương : Mức trung bình hiện tại của tất cả các mẫu được gửi – 428ms.
• Màu đỏ : Độ lệch chuẩn hiện tại – 325ms.
• Màu xanh lá cây : Tỷ lệ thông lượng biểu thị số lượng yêu cầu mỗi phút mà máy chủ xử lý. – 59 964 request/phút
1 vài chú ý:
Throughput càng cao càng tốt. Chứng tỏ server xử lý được nhiều request/thời gian. Nó biểu hiện cho khả năng máy chủ xử lý tải nặng. Throughput càng cao thì hiệu suất máy chủ càng tốt
Deviation: Tham số Deviation được hiện màu đỏ, nó chỉ ra sai lệch so với mức trung bình. Giá trị Deviation càng nhỏ thì càng tốt.

Timer

Timer là một phần rất quan trọng khi xây dựng một Test Plan, nó cho phép cài đặt khoảng thời gian giữa 2 yêu cầu kế tiếp nhau mà người dùng ảo gửi đến máy chủ. Điều này sẽ tạo ra một mô phỏng thực tế nhất so với hoạt động thực tế của người dùng trên website.
JMeter cung cấp nhiều Timer với các dạng khác nhau để thiết lập thời gian nghỉ giữa việc thực hiện 2 yêu cầu , như :
• Constant Timer: xác lập thời gian là một hằng số.
• Uniform Random Timer: xác lập thời gian nghỉ ở một khoảng xác định.
Để sử dụng Timer, ta tạo 1 Flow control action và đặt timer vào trong Follow đó.

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1

Tạo Flow control action: Add -> Sampler -> Follow Control Action
Sau đó ta chọn thêm Timer cho Action này. Ở đây ta sử dụng Uniform Random Timer

Hướng dẫn sử dụng JMeter test hiệu năng website - Phần 1

Action này sẽ “Pause” lại trong khoảng từ 600 ms -> 1000 ms. Rồi mới chuyển qua request tiếp theo.

Vậy là mình đã giới thiệu các thành phần quan trọng của Jmeter trước khi bắt đầu xây dựng một kịch bản test cụ thể. Mọi người theo dõi Phần 2 nhé.

Tham khảo

https://jmeter.apache.org/usermanual/component_reference.html

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

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

Xem thêm Tuyển dụng Tester hấp dẫn trên TopDev

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

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

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

Theo Mohammad Saad

Trong hầu hết các dự án, vấn đề chất lượng là yêu cầu đầu tiên. Nếu bạn ở trong một dự án như vậy, và chưa có bất kỳ một hệ thống kiểm thử tự động chính thống nào được thiết lập, vậy bạn có thể là người đầu tiên triển khai nó. Nó sẽ giúp đỡ dự án của bạn trong việc xây dựng những sản phẩm chất lượng trong thời gian ngắn, và thúc đẩy việc thương mại hóa sản phẩm sớm hơn.

  Automation skills cho tester già mà lười
  Tản mạn về Testing

Trong phần ba của loạt bài này, chúng ta sẽ thảo luận về làm cách nào để áp dụng kiểm thử tự động trong dự án, hiểu rõ bước nào cần làm trước và các lý do.

Đi theo những bước này sẽ giúp chúng ta áp dụng kiểm thử tự động một cách liền mạch và cho phép ngăn chặn những cái bẫy mà có thể làm thất bại việc tự động hóa của chúng ta.

Những bước để áp dụng kiểm thử tự động vào dự án

Bước 1 – Thuyết phục ban lãnh đạo

Bất chấp chúng ta đã tìm hiểu và thiết lập kiểm thử tự động để áp dụng vào dự án như thế nào, bạn không thể làm gì được nếu ban lãnh đạo không bị thuyết phục về lợi ích mà kiểm thử tự động mang lại. Một sự thật hiển nhiên: kiểm thử tự động là tốn kém. Các công cụ mắc tiền (chi phí giấy phép cho HP QTP/UFT vào khoảng 8000$ cho một máy). Những chi phí cho kiến trúc sư kiểm thử tự động hay kỹ sư (theo một cách nhìn khác, cũng khá tốn kém). Sau cùng, lợi ích của kiểm thử tự động là không thể thấy ngay lặp tức. Chúng ta cần phải đợi 2-3 tháng trước khi mã kiểm thử được chuẩn bị, kiểm tra và có thể thực thi một cách chắc chắn để ứng dụng vào thực tế.

Vậy làm sao có thể thuyết phục được họ – ban lãnh đạo? Chúng ta cần nói về phân tích chi phí-lợi ích. Như chúng ta có thể hỏi về thời gian chúng ta đã bỏ ra để làm BAT (Build Acceptance Testing) cho ứng dụng? Và, chúng ta có thể nói, nếu làm thủ công mất một ngày, và với kiểm thử tự động, chúng ta có thể kiểm thử trong vòng 2 giờ đồng hồ. Chi phí là mua công cụ, đào tạo nhân sự và chờ đợi kết quả trong 2 tháng. Sau 2 tháng, chúng ta có thể thực thi kiểm thử BAT trong 2 giờ, và nó sẽ tiết kiệm 6 giờ kiểm thử thủ công bất kỳ khi nào ứng dụng có phiên bản mới. Nếu có 4 phiên bản trong một tháng, chúng ta sẽ tiết kiệm được 24 giờ, hay 3 ngày kiểm thử thủ công.

Nó không có nghĩa là kỹ sư kiểm thử thủ công không làm gì, họ sẽ dùng 6 giờ kiểm thử đó để tập trung vào các chức năng mới và quan trọng của ứng dụng, trong khi kiểm thử tự động sẽ làm những vấn đề qui hồi. Sự thiết lập này sẽ nâng cao chất lượng chung của sản phẩm lên nhiều lần.

Nếu quản lý không sẵn sàng trả giá cho chất lượng của sản phẩm, thì không ai có thể ép họ làm vậy. Họ sẽ học một cách tự động khi khách hàng than phiền về sản phẩm. Chất lượng ảnh hưởng lên mọi thứ. Nó ảnh hưởng đến bán hàng, ảnh hưởng mối quan hệ với khách hàng, ảnh hưởng nhận thức về chúng ta trong mắt khách hàng. Vậy nên, ban lãnh đạo thông minh luôn luôn đầu tư vào trong chất lượng của sản phẩm.

Năm bước cần nhớ để thuyết phục quản lý

  1. Nói về lợi ích của kiểm thử tự động một cách chi tiết
  2. Nói rõ kiểm thử tự động là tốn kém và nó tốn chi phí ban đầu, nhưng chi phí sẽ giảm dần khi mã kiểm thử được chuẩn bị và sẵn sàng thực thi
  3. Nói về thời gian 3 tháng chờ đợi trước khi mong muốn bất kỷ kết quả nào từ kiểm thử tự động
  4. Nói rõ kiểm thử tự động không thay thế kiểm thử thủ công, nhưng có thể hỗ trợ kỹ sư kiểm thử thủ công bằng cách kiểm thử nhiều hơn trong cùng một thời gian
  5. Kiểm thử tự động không có nghĩa là kiểm thử với thời gian ít hơn; nó có nghĩa kiểm thử nhiều hơn với cùng thời gian (nếu kỹ sư kiểm thử thủ công thường dùng 8 giờ để kiểm thử BAT, họ sẽ có thể vừa làm BAT cộng với kiểm thử chức năng mới, đồng thời những thứ khác trong cùng 8 giờ với sự trợ giúp của kiểm thử tự động)

Hãy nhớ, thuyết phục quản lý là bước đầu tiên và quan trọng nhất để áp dụng kiểm thử tự động vào dự án/công ty. Nếu họ không bị thuyết phục, hãy quên kiểm thử tự động đi (hoặc tìm một dự án/công ty khác :-))

Bước 2 – Tìm những chuyên gia về kiểm thử tự động

Có hai dạng chuyên gia về kiểm thử tự động

  1. Kiến trúc sư kiểm thử tự động
  2. Kỹ sư kiểm thử tự động

Kiến trúc sư kiểm thử tự động là rất hiếm. Họ khó tìm, cực kỳ mắc và cũng cực kỳ cần thiết cho sự thành công của dự án kiểm thử tự động. Những người này thường chịu trách nhiệm xây dựng mô hình kiểm thử tự động. (Chúng ta sẽ thảo luận về mô hình kiểm thử tự động một cách chi tiết ở một bài khác).

Kiến trúc sư kiểm thử tự động có kinh nghiệm với các loại công cụ khác nhau và họ biết điểm mạnh cũng như điểm yếu của từng công cụ. Họ sẽ giúp ban quản lý tìm công cụ thích hợp cho kiểm thử tự động với các phân tích ứng dụng và công nghệ dùng trong ứng dụng một cách cẩn thận. Họ cũng sẽ giúp xây dựng mô hình, thiết kế các quy ước đặt tên và tạo ra các qui định cho việc viết mã. Họ cũng hỗ trợ trong việc lựa chọn kịch bản kiểm thử nào nên được tự động hóa trước.

Nếu bạn có thể tìm nhân sự chính xác cho vị trí kiến trúc sư kiểm thử tự động, một nữa công việc của bạn đã hoàn thành.

Kỹ sư kiểm thử tự động, mặt khác, là những người sẽ chuyển hóa kịch bản kiểm thử thủ công thành mã kiểm thử tự động. Họ sẽ làm việc dưới quyền kiến trúc sư kiểm thử tự động và sẽ chịu trách nhiệm tạo và thực thi mã kiểm thử.

Vài công ty tuyển dụng kỹ sư kiểm thử tự động từ bên ngoài, và vài công ty làm tuyển dụng nội bộ với việc đào tạo từ những kỹ sư thủ công đang có sẵn. Dù với trường hợp nào, nhân sự cũng phải có khả năng lập trình, đặc biệt là lập trình hướng đối tượng. Một kết hợp của một kiến trúc sư kiểm thử tự động và các kỹ sư kiểm thử tự động là tuyệt vời cho hầu hết các dự án/sản phẩm.

Bước 3 – Dùng công cụ chính xác cho tự động hóa

Vần đề này xứng đáng có một bài viết riêng, (và sẽ có). Nó là một bước khó khăn trong toàn quá trình bắt đầu kiểm thử tự động. Có rất nhiều công cụ tự động trên thị trường, nhưng chúng ta phải lựa chọn những công cụ tốt nhất cho ứng dụng/dự án của chúng ta.

Nói ngắn gọn, ở đây chỉ liệt kê ra những điểm cần xem xét khi lựa chọn công cụ. Phần giải thích chi tiết sẽ được nói trong một bài riêng.

Những điểm quan trọng cần xem cét khi lựa chọn công cụ chính xác:

  1. Công cụ phải hợp với ngân sách. Những công cụ kiểm thử tự động thật sự rất tốn kém. Vậy nên công ty nên có một ngân sách để mua công cụ.
  2. Công cụ phải hỗ trợ cho công nghệ đang dùng trong ứng dụng/dự án của chúng ta. Nếu ứng dụng sử dụng Flash hay Silverlight, công cụ phải hỗ trợ nó. Nếu ứng dụng là thực thi trên di động, công cụ phải có khả năng thực thi kiểm thử di động. Chúng ta có thể mua một công cụ mà hỗ trợ toàn bộ công nghệ dùng trong ứng dụng, hoặc chúng ta có thể mua nhiều công cụ khác nhau cho từng công nghệ. Ví dụ, chúng ta dùng Selenium cho ứng dụng Web, Robotium cho ứng dụng Android và MS Coded UI cho ứng dụng Windows. Bất kể quyết định là như thế nào, nó phải nằm trong ngân sách của công ty.
  3. Chúng ta phải có nhân sự với kỹ năng cần thiết, những người sẽ sử dụng công cụ hay học dùng công cụ trong thời gian ngắn. Ví dụ, chúng ta đã thuê một kiến trúc sư kiểm thử với kinh nghiệm làm QTP nhưng lại mua giấy phép sử dụng MS Coded UI. Công cụ chỉ như một chiếc xe tốt, và chúng ta cần phải có một tài xế tốt để lại những chiếc xe đó.
  4. Công cụ phải một cơ chế báo cáo tốt để hiển thị kết quả cho các bên liên quan sau mỗi lần thực thi.

Có có những nhân tố khác ảnh hưởng đến việc lựa chọn công cụ, và chúng ta sẽ thảo luận chi tiết ở một bài khác.

Bước 4 – Phân tích ứng dụng khác nhau để xác định những gì phù hợp nhất cho tự động hóa

Nếu công ty đang làm với 5 ứng dụng, không cần thiết toàn bộ sẽ được tự động hóa. Chúng ta cần xem xét những nhân tố khác nhau để lựa chọn ứng dụng nên tự động hóa kiểm thử.

Ứng dụng nên tự động hóa kiểm thử cần có những yếu tố:

  1. Ứng dụng không nên ở giai đoạn đầu của chu trình phát triển (Ứng dụng nên có toàn bộ hay vài chức năng mà đã ổn định và đã kiểm thử bởi kỹ sư kiểm thử thủ công)
  2. Giao diện của ứng dụng cần ổn định (Giao diện không được thay đổi một cách thường xuyên)
  3. Kịch bản kiểm thử thủ công đã được viết ra

Mục tiêu chính của kiểm thử tự động là đảm bảo nếu ứng dụng không có lỗi ở một phiên bản, nó sẽ không có lỗi ỡ phiên bản kế tiếp. Kỹ sư kiểm thử thủ công không nên tốn thời gian của họ để tìm lỗi qui hồi, những vấn đề đó nên được phát hiện bởi kiểm thử tự động.

Vậy nên, để tìm lỗi qui hồi, chúng ta cần một ứng dụng mà đã ổn định và đã có kịch bản kiểm thử cho nó. Nhóm kiểm thử tự động sẽ chuyển hóa những kịch bản kiểm thử thành mã và sẽ thực thi những mã này trên những phiên bản để đảm bảo lỗi qui hồi không xuất hiện.

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

Python: Tạo một máy chủ HTTP đơn giản

Python:Tạo một máy chủ HTTP đơn giản

Bài viết được sự cho phép của tác giả Phạm Văn Nguyên

Web sever có ở khắp mọi nơi.

Cho dù bạn là loại kỹ sư phần mềm nào, tại một số thời điểm trong sự nghiệp, bạn sẽ phải tương tác với các máy chủ web. Có thể bạn đang xây dựng một máy chủ API cho dịch vụ phụ trợ. Hoặc có thể bạn chỉ đang cấu hình một máy chủ web cho trang web của bạn.

Trong bài viết này, tôi sẽ đề cập đến cách tạo máy chủ web http cơ bản nhất trong Python.

Nhưng vì tôi muốn chắc chắn rằng bạn hiểu những gì chúng tôi đang xây dựng, tôi sẽ đưa ra một cái nhìn tổng quan trước tiên về máy chủ web là gì và cách chúng hoạt động.

Nếu bạn đã biết máy chủ web hoạt động như thế nào, thì bạn có thể bỏ qua trực tiếp đến phần này.

Việc làm python lương cao cho bạn

Máy chủ HTTP là gì?

Máy chủ web HTTP không có gì ngoài một quy trình đang chạy trên máy của bạn và thực hiện chính xác hai điều:

1- Listen các yêu cầu http đến trên một địa chỉ TCP socket cụ thể (địa chỉ IP và số cổng mà tôi sẽ nói về sau)

2- Xử lý yêu cầu này và gửi phản hồi lại cho người dùng.

Cụ thể thì hãy xem ví dụ sau:

Hãy tưởng tượng bạn kéo trình duyệt Chrome của mình lên và nhập www.yahoo.com  vào thanh địa chỉ.

Python:Tạo một máy chủ HTTP đơn giản

Tất nhiên, bạn sẽ nhận được trang chủ Yahoo được hiển thị trên cửa sổ trình duyệt của bạn.

Nhưng những gì thực sự chỉ xảy ra?

Trên thực tế rất nhiều điều đã xảy ra và tôi có thể dành cả một bài viết để giải thích sự kỳ diệu đằng sau việc này xảy ra như thế nào.

Ở cấp độ cao, khi bạn nhập www.yahoo.com  trên trình duyệt của mình, trình duyệt của bạn sẽ tạo một thông báo mạng được gọi là yêu cầu HTTP .

Yêu cầu này sẽ đi đến tất cả các máy tính Yahoo có máy chủ web đang chạy trên đó. Máy chủ web này sẽ chặn yêu cầu của bạn và xử lý nó bằng cách phản hồi lại bằng html của trang chủ Yahoo.

Cuối cùng, trình duyệt của bạn hiển thị html này trên màn hình và đó là những gì bạn thấy trên màn hình.

Python:Tạo một máy chủ HTTP đơn giản

Mọi tương tác với trang chủ Yahoo sau đó (ví dụ: khi bạn nhấp vào liên kết) sẽ bắt đầu một yêu cầu mới và phản hồi chính xác như yêu cầu đầu tiên.

Để nhắc lại, máy nhận được yêu cầu http có một quy trình phần mềm được gọi là máy chủ web chạy trên nó. Máy chủ web này chịu trách nhiệm chặn các yêu cầu này và xử lý chúng một cách thích hợp .

Được rồi, bây giờ bạn đã biết máy chủ web là gì và chức năng của nó chính xác là gì, bạn có thể tự hỏi làm thế nào để yêu cầu đến được máy yahoo đó ngay từ đầu?

Câu hỏi hay!

Trong thực tế đây là một trong những câu hỏi yêu thích của tôi mà tôi hỏi các ứng viên tiềm năng trong một cuộc phỏng vấn lập trình viên .

Hãy để tôi giải thích làm thế nào, nhưng một lần nữa.

  Python: Tạo một máy chủ HTTP đơn giản
”]

Địa chỉ  TCP socket

Python:Tạo một máy chủ HTTP đơn giản

Bất kỳ tin nhắn http nào (cho dù đó là yêu cầu hay phản hồi) đều cần biết cách đến đích.

Để đến đích, mỗi thông báo http mang một địa chỉ được gọi là địa chỉ TCP đích .

Và mỗi địa chỉ TCP bao gồm một địa chỉ IP và số cổng .

Tôi biết tất cả các từ viết tắt (TCP, IP, v.v.) có thể áp đảo nếu khái niệm mạng của bạn không mạnh.

Tôi sẽ cố gắng làm cho nó đơn giản nhưng nếu bạn quan tâm đến việc nâng cao kiến thức về các khái niệm mạng, tôi đánh giá cao cuốn sách này của Ross và Kurose .

Vậy địa chỉ đó ở đâu khi tất cả những gì bạn đã làm là gõ www.yahoo.com  trên trình duyệt của bạn?

Chà, tên miền này được chuyển đổi thành địa chỉ IP thông qua cơ sở dữ liệu phân tán lớn gọi là DNS .

Bạn có muốn kiểm tra địa chỉ IP này là gì không?

Dễ dàng! Vào cmd trên windows hoặc terminal trên linux và gõ lệnh sau:

ping yahoo.com

Như bạn có thể thấy, DNS sẽ dịch yahoo.com sang bất kỳ địa chỉ nào ở trên.

Chỉ riêng địa chỉ IP sẽ cho phép tin nhắn HTTP đến đúng máy, nhưng bạn vẫn cần số cổng để yêu cầu HTTP đến chính xác máy chủ web.

Nói cách khác, máy chủ web là một ứng dụng mạng thông thường đang lắng nghe trên một cổng cụ thể.

Và yêu cầu http PHẢI được gửi đến cổng đó.

Vậy số cổng ở đâu khi bạn gõ www.yahoo.com ?

Theo mặc định, số cổng là 80 cho http và 443 cho https , do đó, mặc dù bạn chưa chỉ định rõ ràng số cổng, nó vẫn ở đó.

Và nếu máy chủ web đang nghe số cổng không mặc định (không phải 80 hay 443), bạn phải chỉ định rõ ràng số cổng như thế này:

Python:Tạo một máy chủ HTTP đơn giản

Bây giờ bạn sẽ có tất cả các thông tin cần thiết để tạo một máy chủ web http trong Python.

Vì vậy, không có thêm rắc rối, hãy bắt đầu.

Tạo một tệp HTML đơn giản

Đây là những gì chúng tôi muốn làm.

Chúng tôi muốn tạo một máy chủ http đơn giản phục vụ trang web html tĩnh.

Hãy tạo trang html của chúng tôi.

<html>     <head>         <title>Python is awesome!</title>     </head>     <body>         <h1>Nguyenpv.com</h1>         <p>Congratulations! The HTTP Server is working!</p>     </body>      </html>

Bây giờ hãy tiếp tục và lưu tệp này dưới dạng index.html

Với trang web mà chúng tôi muốn phục vụ theo cách khác, bước tiếp theo là tạo một máy chủ web sẽ phục vụ trang html này.

  Python: Giải thích hàm Sleep

Tạo một máy chủ web HTTP

Để tạo một máy chủ web trong Python 3 , bạn sẽ cần import 2 module: http.server và socketserver

Lưu ý rằng trong Python 2 , có một module có tên  SimpleHTTPServer . Module này đã được hợp nhất vào http.server trong Python 3

Chúng ta hãy xem mã để tạo một máy chủ http

import http.serverimport socketserver PORT = 8080Handler = http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", PORT), Handler) as httpd:     print("serving at port", PORT)     httpd.serve_forever()

Bây giờ hãy phân tích từng dòng mã này.

Đầu tiên, như tôi đã đề cập trước đó, máy chủ web là một quá trình lắng nghe các yêu cầu đến trên địa chỉ TCP cụ thể.

Và như bạn biết bây giờ, một địa chỉ TCP được xác định bởi một địa chỉ IP và số cổng .

Thứ hai, một máy chủ web cũng cần được cho biết cách xử lý các yêu cầu đến.

Những yêu cầu đến được xử lý bởi các xử lý đặc biệt. Bạn có thể nghĩ về một máy chủ web như một người điều phối, một yêu cầu đến, máy chủ http kiểm tra yêu cầu và gửi nó đến một trình xử lý được chỉ định.

Tất nhiên những người xử lý này có thể làm bất cứ điều gì bạn muốn.

Nhưng bạn nghĩ xử lý cơ bản nhất là gì?

Vâng, đó sẽ là một trình xử lý chỉ phục vụ một tệp tĩnh.

Nói cách khác, khi tôi truy cập yahoo.com , máy chủ web ở đầu kia sẽ gửi lại một tệp html tĩnh.

Đây thực tế là những gì chúng tôi đang cố gắng làm chính xác.

Và đó, bạn của tôi, là http.server.SimpleHTTPRequestHandler là gì: một trình xử lý yêu cầu HTTP đơn giản phục vụ các tệp từ thư mục hiện tại và bất kỳ thư mục con nào của nó.

Bây giờ hãy nói về lớp socketserver.TCPServer .

Một phiên bản của TCPServer mô tả một máy chủ sử dụng giao thức TCP để gửi và nhận tin nhắn (http là giao thức lớp ứng dụng trên đầu TCP).

Để khởi tạo Máy chủ TCP, chúng tôi cần hai điều:

1- Địa chỉ TCP (địa chỉ IP và số cổng)

2- Handler

socketserver.TCPServer(("", PORT), Handler)

Như bạn có thể thấy, địa chỉ TCP được truyền dưới dạng một tuple của (địa chỉ ip, port)

IP bằng rỗng có nghĩa là máy chủ sẽ lắng nghe trên bất kỳ giao diện mạng nào (tất cả các địa chỉ IP có sẵn).

Và vì PORT lưu trữ giá trị 8080, nên máy chủ sẽ lắng nghe các yêu cầu đến trên cổng đó.

Đối với handler, chúng ta đang vượt qua trình xử lý đơn giản mà chúng ta đã nói trước đó.

Handler = http.server.SimpleHTTPRequestHandler

Vâng, làm thế nào về serve_forever ?

Serve_forever là một phương thức trên phiên bản TCPServer khởi động máy chủ và bắt đầu lắng nghe và trả lời các yêu cầu đến.

Thật tuyệt, hãy lưu tệp này dưới dạng server.py trong cùng thư mục với index.html vì theo mặc định, SimpleHTTPRequestHandler sẽ tìm một tệp có tên index.html trong thư mục hiện tại.

Trong thư mục đó, khởi động máy chủ web:

$ python server.py

Bằng cách đó, giờ đây bạn có một máy chủ HTTP đang lắng nghe trên bất kỳ giao diện nào tại cổng 8080 đang chờ các yêu cầu http đến.

Bây giờ là thời gian cho những thứ thú vị!

Mở trình duyệt của bạn và nhập localhost: 8080 vào thanh địa chỉ.

Python:Tạo một máy chủ HTTP đơn giản

Tuyệt vời! Hình như mọi thứ đều hoạt động tốt.

Nhưng localhost là gì?

localhost là tên máy chủ có nghĩa là  máy tính này . Nó được sử dụng để truy cập các dịch vụ mạng đang chạy trên máy chủ thông qua giao diện mạng loopback.

Và vì máy chủ web đang nghe trên bất kỳ giao diện nào , nó cũng đang nghe trên giao diện loopback.

Trong thực tế, bạn hoàn toàn có thể thay thế localhost bằng 127.0.0.1 trong trình duyệt của mình và bạn vẫn sẽ nhận được kết quả tương tự.

Tham khảo việc làm IT Hồ Chí Minh trên TopDev

Cuối cùng

Bạn thực sự có thể bắt đầu một máy chủ web với python mà không cần phải viết bất kỳ tập lệnh nào.

Chỉ cần vào cmd (windows ) hoặc terminal (linux) trên máy tính của bạn và làm như sau (nhưng hãy chắc chắn rằng bạn đang ở trên python 3)

python -m http.server 8080

Theo mặc định, máy chủ này sẽ lắng nghe trên tất cả các giao diện và trên cổng 8080.

Nếu bạn muốn nghe một giao diện cụ thể, hãy làm như sau:

python -m http.server 8080 --bind 127.0.0.1

Cũng bắt đầu từ Python 3.7, bạn có thể sử dụng -directory cờ để phục vụ tập tin từ một thư mục mà không nhất thiết phải là thư mục hiện hành.

Học Python?

Nếu bạn là người mới bắt đầu,  thì tôi đánh giá cao cuốn sách này.

Không còn là người mới bắt đầu?

Sau đó, đã đến lúc đưa các kỹ năng Python của bạn lên một tầm cao mới với cuốn sách này

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

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

Viết mẫu tin tuyển dụng (JD) sao cho “ngầu” ?

freelancer IT
freelancer IT

Cách viết mẫu tin tuyển dụng – Bạn cảm thấy bế tắc khi  viết một mẫu tin tuyển dụng có JD – Job Descriptions? Đừng lo lắng vì bài viết này là dành cho bạn. Dù bạn là freelancer it hay các vị trí IT khác nhau, việc nắm bắt yêu cầu tuyen dung it rất quan trọng. Cùng TopDev tìm hiểu nhé!

Nhưng đầu tiên để viết được JD thì cần biết những thứ liên quan đến JD. 

Vấn đề của JD trong mẫu tin tuyển dụng?

Đôi khi nói việc viết một JD hay còn dễ hơn là lúc bắt tay vào làm. Hãy bình tĩnh, bây giờ bạn sẽ không phải như vậy nữa đâu! Cùng Let’s go tìm hiểu các vấn đề của JD để các freelancer it sẽ dễ dàng nắm bắt thông tin.

Hãy quan tâm hai vấn đề trọng tâm sau đây:

Cải thiện giao tiếp nội bộ 

Bạn phải đảm bảo JD được truyền tải một cách rõ ràng. Điều này giúp freelancer IT, hay các ứng viên IT khác dễ dàng hình dung và nắm bắt tốt các yêu cầu công việc.

Nếu như không có JD, hay JD không rõ ràng thì HR professionals hay các phòng ban khác sẽ không hiểu vị trí bạn đang tuyển dụng như thế nào. Dẫn đến việc khó hỗ trợ bạn một cách tốt nhất để thực hiện quy trình tuyển dụng it.

Vì vậy, điều quan trọng là cần thảo luận để đưa ra các góc nhìn, quan điểm để cùng xây dựng một JD hoàn thiện nhất. 

Cải thiện giao tiếp bên ngoài

Vị trí công việc được mô tả rõ ràng và chính xác là rất quan trọng.

Phác thảo một mô tả công việc hấp dẫn là bước đầu tiên trong việc tìm kiếm và tuyển dụng ứng viên chất lượng. Một bản mô tả công việc hấp dẫn có thể giúp bạn thu hút ứng viên chất lượng cao. 

Vậy làm sao để viết JD “chất ngầu”

Dưới đây là một vài tips nhỏ cũng như các kiến thức cần thiết, công cụ và resources, sẽ giúp bạn trong việc viết một JD thiệt xịn xò. 

Xác định sự khác nhau giữa mô tả công việc và đăng tải công việc

freelancer IT
Những thú vị xoay quanh JD

Ai làm chuyên viên tuyển dụng đều cần nhận biết được sự khác biệt giữa mô tả công việc và đăng tải công việc. 

Vị trí công việc là một tài liệu nội bộ giải thích chi tiết về vai trò, trách nhiệm của vị trí freelancer IT. Còn đăng tải công việc là chiêu thức để chiêu mộ ứng viên freelancer it. Đây là tài liệu được public rộng rãi ra bên ngoài. 

Sử dụng cấu trúc JD chung 

Tất cả người làm về tuyển dụng nên viết JD theo một khuôn mẫu chung. Khuôn mẫu này giúp bạn có những điều cơ bản nhất của JD. Tuy nhiên bạn có thể tỏa sức sáng tạo trên JD của chính.

Khuôn mẫu chung bao gồm những thành phần cơ bản sau: 

Vị trí công việc

Vị trí công việc phải được viết rõ ràng và dễ hiểu. Đồng thời, sử dụng tên hay vị trí công việc được nhiều người biết đến; phù hợp với các tiêu chuẩn ngành. 

Ví dụ như trong ngành IT, mình suggest một vài vị trí công việc như freelancer it, senior developer, junior developer, …. Với mỗi ngành đều có tiêu chuẩn tên công việc riêng. Bạn khó có thể nào đề title công việc là lập trình viên cấp cao thay vì để senior developer. Vậy đó, nghe nó chẳng hợp lý chút nào cả (mà lại kém sang nữa).

Tóm tắt vai trò công việc 

List ra những đầu công việc cần phụ trách; giải thích tại sao vị trí công việc này quan trọng trong công ty bạn. Đừng quên ghi thêm vào đó mục tiêu, định hướng của công ty. Điều này giúp tránh trường hợp phát sinh ngoài ý muốn. Ví dụ như Nói một cách dễ hiểu hơn là tuyển sai người. 

Trách nhiệm và vai trò công việc 

Đừng quên list ra các đầu mục về trách nhiệm ứng viên cần có; các vai trò của công việc đó trong công ty như thế nào. Mỗi vị trí trong công ty đều mắt xích với nhau cả. Bạn cần lưu tâm về việc giải thích rõ cụ thể các vai trò của từng vị trí. Nếu không, bạn sẽ khó khăn khi chọn lọc ra CV IT phù hợp. 

Yêu cầu chuyên môn và những kỹ năng liên quan 

Hãy list ra các yêu cầu về trình độ học vấn; chứng chỉ chuyên môn cần có và những kỹ năng mềm khác liên quan đến vị trí công việc đang tuyển. Chính những tiêu chí này sẽ giúp bạn chọn lựa đánh giá được các ứng viên thật sự phù hợp nhất.

freelancer IT
Checklist các kỹ năng cần thiết

Viết JD “có hàng có lối” 

Khuyến khích sử dụng cv template it để chuyên nghiệp hóa cách viết JD. Chỉ cần vào lựa chọn loại nào phù hợp với công ty hoặc với gu thẩm mĩ của bạn là ổn nhất. Sau đó điều chỉnh một chút để phù hợp với JD mà bạn mong muốn. Điều này giúp tiết kiệm thời gian trong việc tuyển dụng các ứng viên freelancer it, senior developer, tuyển dụng Data Scientist,… 

Sử dụng công cụ bổ trợ chuyên nghiệp 

Các công cụ tuyển dụng chuyên ngành được sử dụng nhiều hơn để đáp ứng nhu cầu viết viết và promote JD tuyển dụng. 

Bạn sẽ dễ dàng truy cập các mẫu mô tả công việc miễn phí; xây dựng các trang web tuyển dụng đẹp đẽ (mà không cần coding gì cả). Đồng thời, nó cũng giúp tối ưu hóa việc xuất bản bài đăng trên các trang tuyển dụng khác nhau chỉ với một click chuột.

Bạn cũng có thể thiết lập các chương trình tuyển dụng riêng của công ty mình. Tạo các chiến dịch email hấp dẫn để JD match với mục tiêu ứng viên trên social media. Tất nhiên, những cách thức trên đều có ý nghĩa lớn trong việc thiết lập JD. Và việc tuyển dụng ứng viên freelancer it, senior developer hay bất kỳ một ví trí it nào đó sẽ không còn là vấn đề lớn nữa.

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

Xem thêm việc làm it online hàng đầu tại TopDev

Hanoi Workshop Ecommerce PWA: Make your website feel more like an app

Lợi thế của một PWAs (Progressive Web Apps)?

Đối với lĩnh vực eCommerce, việc cạnh tranh thị phần liên tục mở ra thách thức về đổi mới công nghệ cho mỗi doanh nghiệp. Không dừng lại ở những tính năng độc đáo, mới lạ, mỗi thương hiệu cũng cần chú trọng việc cá nhân hóa sản phẩm và nâng cao trải nghiệm người dùng trên website. PWAs (Progressive Web Apps) mang đến lợi thế của một website hoạt động tương tự native apps, thích hợp hiển thị đa kênh, tối ưu hóa khả năng tiếp cận người dùng dễ dàng trên di động, từ nhiều nguồn đa dạng và phù hợp với bối cảnh headless commerce lên ngôi trong ngành bán lẻ.

Đối với lập trình viên, việc chủ động tìm hiểu xu hướng công nghệ mới như PWA luôn là điều đúng đắn. Tiếp nối thành công từ workshop đầu tiên, Workshop số 2 của Sutunam, với sự đồng hành của TopDev, các chuyên gia công nghệ sẽ giải đáp sâu hơn về kỹ thuật và cách thức triển khai PWAs. Đặc biệt các bạn lập trình đang làm trong lĩnh vực eCommerce sẽ tìm được cho mình một số chú ý về UI/UX khi phát triển PWA cho website thương mại điện tử.

Các chuyên đề và Chuyên gia nào sẽ đồng hành cùng bạn vào workshop ngày 10/12/2020:

1. Introduction to PWA architecture
► Diễn giả: Việt Thái – Lập trình viên Senior về Javascript, Sutunam Vietnam

2. Share capabilities – How thing’s going with PWA?
► Diễn giả: Thanh Tùng – Lập trình viên Senior về Javascript, Sutunam Vietnam

3. Performant components through customization
► Diễn giả: Maya, thành viên Core team Storefront-UI, Israel

Tham gia workshop, bạn sẽ “bỏ túi” những kiến thức thú vị

–  Tổng quan về cấu trúc của PWAs. Các hướng tiếp cận và tính năng cần thiết để thiết kế và xây dựng một ứng dụng PWA.
–  Góc nhìn cụ thể hơn (kèm demo) để hiểu về cách thức hoạt động về cách chia sẻ dữ liệu trong PWAs.
–  Vài nét về giải pháp PWA của headless frontend dành cho các nền tảng e-commerce tối ưu nhất thời điểm hiện tại. Ta cũng sẽ tìm hiểu một số chú ý trong khi tùy biến thiết kế cho các tình huống đặc thù trong e-commerce.
–  Hiểu rõ cách tạo ra một UI library cho phép tùy chỉnh các component một cách tự do nhất có thể, trong khi vẫn có thể bảo đảm tối ưu hiệu suất và khả năng mở rộng?

Đối tượng: các lập trình viên, PM và những người làm trong lĩnh vực lập trình, thương mại điện tử. Vì số lượng chỗ ngồi có hạn, bạn vui lòng đăng ký sớm để giữ những slots cuối cùng nhé!

 

*Sự kiện không thu phí!*

Sutunam & TopDev hẹn gặp bạn!