Home Blog Page 162

Product Manager là gì? Chân dung của một Product Manager

product manager là gì

Cụm từ “Product Manager” không còn là thuật ngữ xa lạ với cộng đồng IT – Lập trình trong những năm gần đây. Đối với nhiều bạn đã trong ngành một thời gian đang muốn thăng tiến nghề nghiệp, thì giấc mơ Product Manager là vô cùng có sức hấp dẫn. Tại Việt Nam hiện không ít các sự kiện về Product Manager, các buổi sharing cũng như định hướng nghề cho một Product Manager. Vị trí là cánh cửa đối với gần như mọi background ngành nghề: Bạn có thể đi từ lập trình, thiết kế, hoặc mới tốt nghiệp ngành kinh doanh, phân tích viên tại công ty,… Gần như không có giới hạn.

Tuy nhiên, bề nổi có sang có hay đấy, nhưng để đến được đấy thì còn nhiều thứ cần làm rõ – hiểu sâu & mài dũa thì mới bước tiếp được. Bài viết bên dưới sẽ “vẽ” ra chi tiết hơn về “bức tranh” Product Manager cho những ai đang đuổi mây và những gì họ cần chuẩn bị nếu như đang hướng đến vị trí này. 

Hiểu về Product Manager là gì?

Nói về Product Manager (Người quản lý sản phẩm) không dễ để có được một định nghĩa chính xác và đầy đủ nhất, bởi mỗi công ty có một kiểu định nghĩa khác nhau. Trên thực tế, Product Manager chính là người quản lý sản phẩm, chịu trách nhiệm chính, dẫn dắt và liên kết các bộ phận với nhau để cùng thực hiện mục tiêu nhất định. Nói một cách chính xác hơn thì PM chính là cầu nối giữa UX, Technology và Business.

  • Business – Ưu tiên trên hết của việc quản lý sản phẩm là business: tập trung vào tối đa hóa giá trị kinh doanh từ sản phẩm. 
  • Technology – Xác định được cái mình muốn build phải đi kèm với câu hỏi “Build bằng cái gì?”. Điều này không có nghĩa PM phải ngồi xuống “cà phím” viết code, nhưng phải hiểu được các công nghệ cần có, và quan trọng nhất là việc hiểu được những gì cần thiết để đưa ra quyết định đúng đắn. 
  • UX (Trải nghiệm người dùng) – Product Manager phải vừa là tiếng nói của doanh nghiệp, vừa phải quan tâm và đầu tư vào trải nghiệm người dùng. 

Product Manager cần phải cân bằng nó và đưa ra những quyết định và đánh đổi quan trọng cần thiết. Từ đó dẫn đến một quy trình chiến lược để quản lý và phát triển sản phẩm hợp lý. Trên thực tế, điều này đồng nghĩa với việc thúc quản nhiều việc nhỏ cùng một lúc: quản lý tồn đọng sản phẩm, duy trì product roadmap, nói chuyện với cổ đông, nói chuyện với khách hàng và điều phối hoạt động của nhóm để đảm bảo tất cả các bạn đều làm việc theo cùng một mục tiêu.

Đây không phải là một nhiệm vụ đơn giản – nó liên quan đến rất nhiều người. Trên thực tế, phẩm chất quan trọng nhất mà người quản lý sản phẩm mang đến là khả năng làm việc với mọi người. Điều quan trọng là bạn giỏi đến mức nào để khiến mọi người từ các khu vực khác nhau của công ty, với các chương trình nghị sự và động lực khác nhau, đoàn kết đằng sau tầm nhìn của bạn.

Xem thêm

Vậy Product Management là gì?

Product Management – Quản lý sản phẩm, là quá trình quyết định xây dựng Cái gìBằng cách nào xây dựng nó. Có thể nói trắng ra là “xác định chiến lược và trải nghiệm sản phẩm”. Là một Product Manager, bạn sẽ có cái tên khác dưới cương vị “CEO của sản phẩm”.

Quy trình Product Management sẽ có “bức tranh chung” như sau:

  • Nghiên cứu thị trường và nội bộ: Nghiên cứu để đạt được chuyên môn về thị trường chung của công ty, từ người dùng và từ đối thủ. Hiểu rõ sản phẩm và thị trường là điều quan trọng đầu tiên, nhất định bạn phải hiểu rõ từng chi tiết sản phẩm của mình hơn bất kỳ ai.

Tuy nhiên, chỉ dừng ở mức hiểu sản phẩm thôi vẫn chưa đủ mà bên cạnh đó bạn còn phải hiểu thị trường tiềm năng, nắm bắt được tâm lý khách hàng hiện tại và cả nhóm khách hàng mà bạn muốn hướng đến. Chưa kể là present thuyết trình với nội bộ công ty, nhà đầu tư và các stakeholder để chính thức bắt tay vào kế hoạch.

  • Phát triển chiến lược: Từ thông tin dữ liệu ngành đã có được, phát triển nên một kế hoạch chiến lược cho sản phẩm – bao gồm cả mục tiêu và mục đích, một sơ đồ tổng quan cho sản phẩm trên một timeline chi tiết. Tại đây cần phải có khả năng định hướng những bước đi kế tiếp, những mục tiêu mà sản phẩm sắp hướng đến. Và quan trọng hơn là phải nắm bắt sản phẩm của đối thủ. 
  • Kế hoạch về Product: Phát triển kế hoạch cho sản phẩm theo dạng Product Roadmap features (roadmap về các tính năng). Ngoài ra thống nhất về UX bằng wireframe và các mockups Designs cũng cần phải thống nhất thông qua tại đây. 
  • Lên UX và Design: Một sản phẩm muốn tồn tại lâu trên thị trường thì phải có một UI cực kì đơn giản và dễ dùng, UX thì ấn tượng trơn tru. Thử đặt vấn đề, nếu một ứng dụng nào đó ra mắt nhưng UI lại quá phức tạp, UX không mượt mà thì bảo đảm người tiêu dùng sẽ “một đi không trở lại”. 

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

Đến hiện tại, khi công nghệ 4.0 đang “làm mưa làm gió” thì tầm quan trọng của UI/UX lại càng được nâng lên. Chính vì vậy, là một PM nhất định bạn phải đảm bảo UI/UX thật hoàn hảo.

  • Phối hợp phát triển build sản phẩm: Sau khi kế hoạch và các đầu hạng mục đã được “bật đèn xanh”, bây giờ sẽ tiến hành phối hợp với các bộ phận có liên quan để code nên sản phẩm cuối và chuẩn bị cho testing và launching ra thị trường.
  • Thu thập feedback và phân tích dữ liệu: Sau một loạt building, testing, và cho sản phẩm ra mắt thị trường, hãy tiếp tục thu thập và học dữ liệu người dùng – hãy thẩm thấu feedback trực tiếp của users, cái gì tốt – cái gì chưa tốt, cái nào chạy – cái nào không chạy và cần bổ sung cái gì.

Từ đây sẽ quay lại khâu “Product” và làm việc trực tiếp với các bộ phận liên quan để cải thiện chúng cho những lần sau.

Có một sự thật trớ trêu thay, đó là hiện nay rất nhiều Product Manager không thực hiện đủ Product Management. Rất nhiều PM chỉ bị cuốn vào những phần việc quá nhỏ nhặt. Thực tế nó không sai, nhưng nó cũng không đủ. Một số công ty còn thiếu những điều cơ bản, ví dụ: khung quản lý sản phẩm, duy trì lộ trình sản phẩm, viết yêu cầu của khách hàng, hiểu lợi thế cạnh tranh làm các nghiên cứu về độ khả thi. Thực tế cho thấy cụm từ Product Management tại mỗi công ty và ngữ cảnh sẽ có ý nghĩa khác nhau.

  • Làm Product Management tại một công ty startup cần có tư duy khởi nghiệp mạnh mẽ và không ngừng chạy thử nghiệm. Họ tập trung vào vấn đề mà startup của họ đã đặt ra để giải quyết. Họ có thể thay đổi bất cứ điều gì và bất cứ thứ gì nhanh chóng.
  • Mặt khác, tại một công ty lớn, thì quy trình sẽ tập trung vào tối ưu hóa, lặp lại và quản lý phối hợp chi tiết giữa tất cả các team cross-functional phức tạp. Tại các công ty lớn, bản thân sản phẩm có thể đã gần như được xác định. Nhiệm vụ chính của Product management là giải quyết các chi tiết, cân đối sản phẩm phù hợp với công ty và phân phối.

Mặt dù Project Management sẽ đều có 1 khung quy trình chuẩn để follow, tuy nhiên vai trò thực tế của một PM có thể khác nhau nhiều giữa các công ty lớn và nhỏ. Chính vì thế hãy dựa trên ngữ cảnh hiện tại của bạn để đánh giá xem bước tiếp theo của bạn là gì.

  Tầm quan trọng của Product Management

Công việc của Product Manager = Product Management?

Đây phần mà bàn dân thiên hạ hay hiểu sai nhất về vị trí Product Manager. 

“Ông làm quản lý sản phẩm là ông quản lý cái sản phẩm phải không?”

Đúng, mà cũng không đúng! Trong Job Description của Product Manager thì Product Management chỉ là một function – một trọng trách trong nhiều workload khác của một Product Manager mà thôi.

Đặt mình ở vị trí của người dùng 

Có nghĩa là, PM sẽ phải là người thấu hiểu được khách hàng của mình mong muốn điều gì để từ đó nói lên những vấn đề mà họ gặp phải để khắc phục nhanh chóng. Ví dụ: Một người dùng đang khó khăn và bất tiện về việc mỗi lần login là phải nhập lại pass. Công việc của PM lúc này là biết được vấn đề này từ sớm và tác động đến team để cải thiện tính năng này thành lưu mật khẩu tự động.

Product manager jd

Chú trọng về trải nghiệm người dùng cuối

Là PM trong lĩnh vực technology thì bạn đã hiểu tầm quan trọng của một UI/UX “ngon”. Một sản phẩm muốn tồn tại lâu trên thị trường thì phải có một UI đơn giản và dễ sử dụng. UX cũng phải được đảm bảo. Nếu bản thân dùng một ứng dụng nào nhưng UI lại quá phức tạp và UX không mượt mà thì bảo đảm – không cần đến người tiêu dùng – chính bạn sẽ “dứt áo ra đi” trước. Trong thời buổi công nghệ 4.0 đang “làm mưa làm gió” thì tầm quan trọng của UI/UX lại càng được nâng lên. Chính vì vậy, là một PM nhất định bạn phải đảm bảo UI/UX thật hoàn hảo.

Sản phẩm “thật”

Khi trở thành một Product Manager, bất cứ những tính năng mà bạn mang đến cho người dùng đều phải có căn cứ và những số liệu cụ thể. Bạn phải thấy được rằng nó thực sự cần thiết và người dùng mong muốn được trải nghiệm. Theo lý thuyết, tính năng ấy rất hữu dụng, thế nhưng trớ trêu rằng người dùng lại không sử dụng. Vậy bài toán đặt ra là bạn phải làm sao cho tính năng ấy “ nổi bật” bằng cách thay đổi thiết kế. Cuối cùng, bạn thu thập dữ liệu và đi đến kết luận. Đừng bao giờ đoán mò mà phải thực thi nó.

“Đoàn kết là power” – Hợp tác cùng đồng đội

Một PM còn phải lo về việc giao tiếp – truyền đạt các mục tiêu và kế hoạch sản phẩm cho phần còn lại của công ty. Họ phải đảm bảo tất cả mọi người đang làm việc hướng tới một mục tiêu tổ chức chung.

Trách nhiệm là cầu nối nên PM ngoài việc hợp tác với khách hàng thì PM cần phải chủ động hỗ trợ và hợp tác với các bộ phận Sales, Marketing, IT. Bên cạnh đó, bạn cũng phải cộng sự với các Project Managers, Business Analysts và Developers.

Điều này cực kỳ quan trọng bởi họ là người dựng nên sản phẩm của bạn, và nhiệm vụ của bạn là làm sao để họ cũng thấu hiểu sản phẩm giống như bạn. Một Product Manager giỏi luôn có một tầm nhìn tốt cho sản phẩm và biết cách “chèo lái” làm sao để sản phẩm đi đúng theo mục tiêu.

Nhạy cảm với sự thay đổi và chịu bứt phá

Nếu bạn là một Product Manager thì nhạy cảm với sự thay đổi là một tố chất nên có. Khi mà thời đại công nghệ vượt trội đang phát triển, hàng ngày hàng giờ thậm chí là mỗi phút mỗi giây lại có những phát minh mới ra đời, nếu bạn không chấp nhận thay đổi mình thì chắc chắn sản phẩm của bạn sẽ “lạc hậu”, mà gay gắt nhất là trong lĩnh vực công nghệ, có thể chỉ cần qua một đêm thì bạn đã trở nên “ lỗi thời” là điều không khó gặp. Cho nên, nhất định phải thích nghi với sự thay đổi và biến chuyển liên tục của xã hội và học cách thích nghi nó.

Đừng bao giờ “ngủ quên trong chiến thắng” mà hãy xem đó là động lực để nghĩ ra nhưng xu hướng mới táo bạo hơn.

  Mẫu bảng mô tả công việc vị trí Product Manager

Sau tất cả, làm sao để trở thành một Product Manager giỏi?

Trước khi trở thành một Product Manager “giỏi”, Thật khó để bỗng dưng được nhảy vào quản lý sản phẩm trong khi bạn chưa bao giờ thật sự làm “quản lý sản phẩm”. Thế làm sao một công ty sẽ cho phép bạn phụ trách sản phẩm của họ nếu bạn chưa bao giờ chịu trách nhiệm về bất kỳ sản phẩm nào?

Một điều không thể bàn lui được: Muốn làm Product Manager thì phải làm Product Manager đã!

Dù cho từ background nào, kiến thức chuyên về cái gì đi chăng nữa, thì bạn phải làm làm Product tại một công ty trước, để “nhúng tay” vào những công việc và process trên trước.

Rèn luyện mindset về product 

Phải hiểu sâu sắc sản phẩm hoặc cái bạn đang offer trước, luôn bắt đầu từ những câu hỏi:

  • Tại sao sản phẩm này tồn tại? Nó đang giải quyết vấn đề gì?
  • Sản phẩm của bạn phục vụ ai? Ai thì KHÔNG phải đối tượng phục vụ?
  • Sản phẩm của bạn khác với đối thủ như thế nào?
  • Sản phẩm của bạn có những tính năng gì? Những tính năng nào nó KHÔNG có?
  • Với sản phẩm này thì bạn sẽ mang đến cho khách hàng cảm xúc gì?

Tham khảo bài viết về Mindset người làm Product để hiểu hơn về quá trình rèn luyện bản thân

Trang bị cho mình như một full-stacker 

Tương truyền rằng Product Manager không cần quá nhiều kỹ năng cứng, vào theo dõi quan sát thôi. Thế nhưng như bạn đã thấy đấy, từ Scope of Work đến Quy trình làm việc đâu chỉ dừng ở đấy. Vì thế sẽ không có lý do gì mà bạn không trang bị cho mình một loạt các kỹ năng – kiến thức khác trực tiếp phục vụ cho vị trí cả. Tất cả những kỹ năng mới đều dễ tiếp cận và dễ học cả, chỉ cần một ít commitment và kỷ luật theo xuyên suốt.

Bất kỳ PM nào cũng nên biết CODE một ít cả, đơn giản thì có HTML / CSS / Jquery. Bạn có thể không code cả sản phẩm đấy, nhưng nếu có biết về lập trình thì có khi bạn sẽ trang hoàng sản phẩm nên tốt gấp đôi.

Ngoài ra, như ex-PM huyền thoại Steve Jobs đã dạy chúng ta một điều rằng: Thiết kế rất quan trọng. Mỗi PM đều nên có kỹ năng thiết kế cơ bản. Không cần phải đến như “Pháp sư Photoshop”, nó có nghĩa là các kỹ năng và kiến thức về nguyên lý thiết kế cốt lõi. Lời khuyên này áp dụng không chỉ với B2C đâu, cả các sản phẩm B2B cũng thế.

Xây dựng kỹ năng giao tiếp nhóm

90% khả năng thăng tiến trong sự nghiệp của bạn đến từ các kỹ năng trí tuệ cảm xúc (EQ), chứ không phải IQ, đặc biệt là ở các level cao hơn. Xây dựng kỹ năng giao tiếp và làm việc nhóm là CỰC KỲ quan trọng đối với sự phát triển của bạn. Một nhà Product Manager cần phải là người đồng đội xuất sắc và người có sự đồng cảm cao. Và tin mừng cho các bạn có xu hướng “khô khan”: Các kỹ năng mềm đều học được và rèn dũa được theo thời gian.

Tìm một “mentor” cho chính mình

Có được một người Senior hoặc Mentor đã làm trong ngành của bạn để giúp bạn có cái nhìn sâu hơn về ngành và định hướng nghề sẽ giúp cho bạn thêm nhiều động lực và khả năng để tiến xa hơn với vị trí Product Manager.

Nếu chưa đủ networking, người mentor này cũng không nhất thiết phải là người thân hoặc quen biết cá nhân của bạn. Hãy tìm kiếm thông tin, đọc nhiều – để ý nhiều các sharing định hướng của các Product Manager khác trong ngành, rồi từ đó theo dõi có thể xin “chỉ giáo vài đường” từ họ, quan trọng ở thái độ và cách tiếp cận của bạn.

Các tài nguyên cho Product Manager tương lai

Những đầu sách nên đọc

TopDev Blog cũng sẽ tiếp tục series về Product Manager trong thời gian sắp đến. Đừng bỏ lỡ nhé!

Bạn đã sẵn sàng?

“Hành trình đến Olympia” giới Product đến đây, đương nhiên là chưa chưa đủ. Nhưng đây là một khởi đầu tốt cho bạn. 

Điều thú vị về quản lý sản phẩm là không có con đường nhất định để trở thành nhà quản lý sản phẩm. Không cần bằng cấp – rào cản nào ngáng đường bạn đến với vị trí này cả – một vị trí tạo ra một tác động hữu hình thực sự cho công ty của bạn.

Có một sự thật là, những PM tốt nhất trên thế giới đều tự thân vận động (self-taught) mà ra cả.

Nếu thật sự nghiêm túc về quản lý sản phẩm, cách tốt nhất để chuẩn bị là lao thẳng vào đó, lắng nghe và học hỏi kinh nghiệm từ những người khác.

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

TopDev tổng hợp

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

Quản lý dự án theo Agile và Scrum cho người mới bắt đầu

quản lý dự án theo agile và scrum

Giải thích một trong những thuật ngữ rất phổ biến của quy trình phát triển phần mềm

Làm trong các công ty phần mềm, bạn sẽ nghe đi nghe lại mấy chữ này ScrumAgileplanning pokerStand upSprint. Nó là những thuật ngữ được dùng ám chỉ một quy cách tổ chức công việc, xét độ ưu tiên, và phân phối những công việc này giữa các thành viên trong team.

Agile và Scrum

Agile và Scrum hay đi chung, nhưng nó khác nhau (không lớn lắm).

  • Agile là phương pháp được sáng tạo bởi Agile Manifesto, nó là lý thuyết nền tảng
  • Scrum là một framework hiện thực hóa từ đóng lý thuyết hầm bà lằng của Agile

Ví dụ đi tập gym, bạn muốn tăng cơ giảm mỡ, trong đó bạn sẽ có rất nhiều dạng bài tập, thích tay to, chân to, ngực to, mông to,… thì có những bài tập khác nhau để chọn. Scrum là một trong những dạng bài tập như thếAgile là quy định của phòng tập, bạn phải đến đó 3 ngày một tuần, một buổi 2 tiếng.

Về nguồn gốc, Agile được sử dụng rộng rãi trong các công ty Nhật Bản từ những thập niên 70, 80 như Toyota, Fuji, Honda

Vào giữa những năm 90, Jeff Sutherland cảm thấy quá bực bội vì công ty của ông ta liên tục dính những dự án trễ kế hoạch, vượt ngân sách. Anh ấy đi tìm giải pháp cho vấn đề này, đọc thấy Agile, anh bắt đầu “chế” Scrum, và nó nhanh chóng được cộng đồng công nghệ sử dụng rộng rãi.

Xem thêm tuyển agile lương cao hay việc làm scrum hấp dẫn

Scrum dành cho ai

Nói Scrum chỉ thật sự có ích cho kỹ sư, lập trình viên thấy không đúng. Scrum còn mang đến nhiều lợi ích khác cho nhiều loại dự án khác nữa, vì ngay từ đầu người sáng tạo ra Agile không phải để dùng riêng cho ngành phần mềm.

David Matthew có phát biểu: “Nếu bạn đang làm việc trong lĩnh vực marketing, cần viết một văn bản cho dự án, sử dụng Scrum không chỉ giúp bạn cấu trúc bài viết của bạn tốt hơn, nó còn giúp các thành viên trong team hiểu vấn đề tốt hơn”

Scrum đang được dùng rộng rãi bởi FBI, các bạn làm marketing, những đội ngũ xây dựng (đang nói ở nước ngoài nhé). Miễn bạn đang cần làm một sản phẩm, một phần mềm, chiến dịch quảng cáo, Scrum có thể giúp team của bạn vận hành có tổ chức hơn, làm mọi thứ nhanh hơn.

Vai trò và các phần của Scrum

Bạn không cần gì nhiều để bắt đầu với Scrum, bạn chỉ một nơi để tổ chức các ý tưởng của mình, hoặc gọi là Backlog, bạn cần những người cho những vai trò khác nhau, product ownerScrum master

  • Product owner là người quan tâm đến sản phẩm cuối cùng, người có quyền quyết định sản phẩm cuối cùng sẽ có gì. Người này sẽ đảm nhiệm việc tạo backlog – một tập các công việc cần làm, tập các yêu cầu cần có cho sản phẩm. Yêu cầu bắt buộc của Backlog là nó phải có thứ tự ưu tiên, product owner phải quyết định cái nào trước cái nào sau. Ví dụ nếu đang chế một cái xe thì động cơ phải nằm trên mục cao nhất của yêu cầu, được sơn màu đỏ thì có thể nằm ở cuối danh sách.
  • Sprint là một khung thời gian cố định mà toàn bộ team phải xong một phần công việc được quy ước trong backlog. Thời gian dài ngắn tùy thuộc vào yêu cầu của team, 2 tuần là lựa chọn phổ biến.
  • Daily scrum là một một buổi họp hằng ngày để cập nhập tình hình công việc, còn gọi là Daily stand up
  • Kết thúc mỗi Sprint là tổng kết, đánh giá cuối năm học, mọi người xem lại công việc của mình, bàn luận những thứ có thể cải thiện cho Sprint sau.

Tham khảo thêm: >>> Việc làm scrum master hấp dẫn chất nhất tại Topdev

Như bạn thấy, không có gì yêu cầu đặc biệt về thiết bị hay training để bắt đầu. Phần khó nhất chỉ là phân biệt được từng khái niệm, làm đúng vai trò và đọc kỹ hướng dẫn sử dụng trước khi dùng.

TopDev via Vuilaptrinh

Xem thêm các vị trí tuyển dụng it mới nhất tại đây

Thời đại của Pixel Perfect Design đã hết từ lâu

Khi bắt dầu dàn trang design cho web, hãy sử dụng những hệ thống grid phổ biến hiện nay như Bootstrap Grid. Nếu bạn là designer mà chưa biết đến CSS framework này thì thiệt thiếu xót trầm trọng…

Tác giả: Lưu Bình An

Grid

Khi bắt đầu dàn trang cho web, sử dụng những hệ thống grid phổ biến hiện nay như Bootstrap Grid. Nếu bạn là designer mà chưa biết đến CSS framework này thì thiệt thiếu xót trầm trọng, nó giải quyết phần lớn các yêu cầu cơ bản về layout, thống nhất sử dụng ngay từ đầu sẽ giúp ít rất nhiều cho mấy anh developer. Quan trọng nhất nên lưu ý là hệ thống grid ngày nay sử dụng độ rộng tương đối (theo giá trị phần trăm của container) và khoảng cách padding cố định. Bạn có thể đọc bài viết sau để hiểu cách xây dựng hệ thống grid trên Sketch

Khi sử dụng hệ thống grid như bootstrap bạn sẽ không bao giờ cần phải nói cho anh developer kích thước của từng cột là mấy, vì thực sự lúc này kích thước nó chỉ là một giá trị tương đối

Responsive design

Bạn designer chỉ cần chỉ cho anh developer từng element nó sẽ như thế nào trên các kích thước màn hình khác nhau, luôn luôn nghĩ các element có một kích thước tương đối chứ không phải một giá trị cố định nào đó như 320 – 1024 -1920, vì giao diện responsive phải có khả năng thích nghi với nhiều dạng kích thước màn hình khác nhau nữa.

Không chỉ vậy, một số hình có kích thước phụ thuộc vào container của nó, ví dụ trên desktop bạn cho một cái hình kích thước 200×200, nhưng trên điện thoại kích thước của màn hình sẽ là 375×667 đi, thì các hình này chắc chắn bể liền, thường thấy trên mấy cái thumbnail bài viết.

Một lỗi thường thấy khác là quên rằng độ cao của một số element sẽ thay đổi theo container

Sử dụng những breakpoint căn bản: 320-375-768-1024-1280-1366-1920. Và tất nhiên tất cả các anh designer đều quên là giao diện đôi khi được xem trên màn hình lật ngang ra.

Ví dụ bên dưới 2 cột hiển thị rất đẹp trên desktop nhưng do sự thay đổi độ cao trên mobile mà nó sẽ trở nên xấu xí

Đừng sáng tạo ra cái có sẵn

Nếu không có thời gian, hoặc không chắc có thể customize những component nhỏ xíu như cái dropdown theo kiểu “thích vẽ sau vẻ”, hỏi anh developer xem anh có suggest cái thư viện nào có sẵn, thay vì làm lại cái người ta đã làm tốt lắm rồi. Một ví dụ kinh điển là cái datepicker. Rát nhiều designer nghĩ chỉ cần vẽ cái lịch với con số trên đó, mà quên rằng

  • Hover effect trên từng ngày
  • Trạng thái ngày hiện tại
  • Làm sao đánh dấu ngày được chọn
  • Làm sao thay đổi tháng, năm
  • Ngày trước và sau của tháng hiện tại

Chúng ta đang sống trong cái thời đại mà mọi người đều cố xây dựng mọi thứ của riêng mình (style Nhật). Đôi khi, có một sản phẩm chạy được cho khách hàng thì tốt hơn là lãng phí thời gian và tiền bạc cho một anh designer ngồi đó sáng tạo ra những thứ người ta đã có sẵn. Designer phải biết rằng anh có thể sử dụng những thư viện và component có sẵn  để hoàn tất project. Nó sẽ giảm đi effect không chỉ của designer mà còn cả developer ngồi đó tìm ra những giải pháp không thực sự cần thiết

Hiệu ứng

Một số tool cho designer như InVision, Axure để biểu diễn flow, Principle, Framer, Adobe After Effect để mô tả hiệu chạy thế nào. Nó sẽ giảm đi những hiểu nhầm giữa designer và developer, khách hàng.

UI kits

UI kit là tất cả những element bạn đang sử dụng trong project, nếu là dân React có thể gọi là component. Sau này khi muốn maintenance sẽ dễ dàng hơn khi dự án ngày càng phình ra.

Trong cái UI kit cần xác định những thành phần: bảng màu sử dụng, typography, các component như button, input, slider, hover, active state, cũng như người lập trình luôn tâm niệm nếu lập lại một đoạn code một lần thứ 2 trong đời thì cho nó ngay vào thư viện để tái sử dụng. Thường khi các bạn designer không có làm kiểu này thì trước sau gì cũng xảy ra trường hợp cùng một button mà chỗ này khác chỗ kia khác một chút, mà các bạn tester và khách hàng khác cái giao diện là đè đầu thằng developer ra chửi, trong khi cái đó nhiều khi bạn designer không cố ý mà vô tình quên mất mình đã format cái button đó ở đâu đó rồi.

Bạn có thể sử dụng Craft để làm thư viện UI

Xuất file

Giúp ảnh developer, hãy sử dụng những công cụ sau

Element state

Các bạn design hay chỉ làm mỗi cái trạng thái default mà quên rằng một element sẽ có rất nhiều state khác như, như active, hover, focus, visited

Line-Height

Có thể khẳng định là 100% anh designer sẽ không để ý đến giá trị này, mà cứ đè ra đo độ cao chính xác từng pixel của element, trong khi không hề biết cái line-height sẽ ảnh hưởng đến độ cao này, đâm ra anh quên cộng vào, và khi anh developer set cái padding trong code là 13, 14 thì anh la làng là nó phải 20, trong khi nếu cộng vào cái line-height nữa nó sẽ ra là 20.

Một ưu điềm khác khi sử dụng Sketch là lúc làm sẽ thấy ngay sự ảnh hưởng line-height, trong khi photoshop thì sẽ không thấy được

Giá trị line-height nên không nên thay đổi nhiều quá trên từng element mà thống nhất xài chung một kiểu

Font

Trước hết, xác định là: “LUÔN LUÔN sử dụng Google Fonts” nếu muốn xài một font không có sẵn trong máy, bạn developer sẽ không phải đi mò mẫm convert cái font chữ của bạn design chôm ở đâu đó, một công việc vốn quá nhiều rủi ro do vấn đề bản quyền, vấn đề lỗi convert có thể xảy ra, lỗi hiển thị trên các trình duyệt khác nhau.

Cũng không bao giờ được xài nhiều hơn 2 font ngoài hệ thống, quá nhiều font phải load, làm ảnh hưởng tốc độ load site. Không sử dụng quá nhiều font style italic, bold, light, thin, regular, một đóng hầm bà lằng, luôn nhớ trong đầu less is more

Kết

Thằng designer thì vốn không ưa thằng developer, chê thằng developer không thấy được sự sáng tạo của nó, còn thằng developer thì luôn chửi thằng designer, nó cứ chế biến mấy cái tào lào khó implement chết mịa luôn. Tất cả những vấn đề trên có thể giải quyết bằng một cách thôi: TRAO ĐỔI. Trao đổi càng sớm, trao đổi khi có vấn đề sẽ tránh cho ra kết quả mà nhìn vào không dám nhận là con của mình. Với tất cả những dự án dù lớn hay nhỏ thì luôn luôn bạn phải cân đối giữa kết quả mong muốn, thời gian và chi phí phải bỏ ra

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

CÙNG STARTUP CHÂU Á TRANH TÀI VÀ MỞ RỘNG THỊ TRƯỜNG QUỐC TẾ TẠI K-STARTUP GRAND CHALLENGE 2020

K-STARTUP GRAND CHALLENGE 2020
Vòng chung kết K-Startup Grand Challenge 2019 diễn ra ở Gangnamgu, Seoul vào tháng 12/2019

Với mong muốn mang đến càng nhiều cơ hội để các startup Việt khôi phục sau giai đoạn khó khăn do COVID-19 và lấy đà tăng tốc phát triển mạnh mẽ, cuộc thi “K-Startup Grand Challenge 2020 (KSGC 2020)” là sân chơi khởi nghiệp quốc tế hỗ trợ các startup phát triển tại thị trường Hàn Quốc và lấy đà mở rộng thị trường ra toàn châu Á. Đến năm  2019, cuộc thi đã nhận được 7402 đơn đăng ký dự thi từ 151 quốc gia với hơn 1.2 tỉ USD vốn đầu tư Startup được xúc tiến.

Chinh phục thị trường quốc tế – Câu chuyện không mới

Mở rộng thị trường ra nước ngoài là một bài toán khó mà nhiều doanh nghiệp khởi nghiệp (startup) Việt Nam luôn muốn chinh phục khi phát triển. Mở rộng thị trường ra các nước khác đồng nghĩa với mở rộng nguồn doanh thu cho doanh nghiệp, hạn chế bị ảnh hưởng từ các yếu tố bên ngoài tại một khu vực. Đồng thời, startup có thể mở rộng kết nối, nhận được hỗ trợ từ nhiều nguồn lực hơn và nhất là các quỹ đầu tư quy mô lớn trên toàn cầu.

Từ các startup có kinh nghiệm tiếp cận thị trường quốc tế, nhiều vấn đề và khó khăn đã được đặt ra: từ ngôn ngữ và thói quen tiêu dùng khác nhau của thị trường, chính sách pháp lý khác biệt, niềm tin của thị trường mới vào sản phẩm nước ngoài, khả năng tồn tại trong quá trình thử nghiệm thị trường,… Startup cần tự mình giải quyết rất nhiều vấn đề nếu như không tìm được một cố vấn hoặc chuyên gia quốc tế hỗ trợ, không kết nối được với đơn vị hỗ trợ khởi nghiệp tại khu vực mục tiêu hoặc không có đủ nguồn lực tài chính để duy trì vận hành. 

Bước đệm để khôi phục và phát triển sau đại dịch

Với mong muốn mang đến càng nhiều cơ hội để các startup Việt khôi phục sau giai đoạn khó khăn do COVID-19 và lấy đà tăng tốc phát triển mạnh mẽ, cuộc thi “K-Startup Grand Challenge 2020 (KSGC 2020)” là sân chơi khởi nghiệp quốc tế hỗ trợ các startup phát triển tại thị trường Hàn Quốc và lấy đà mở rộng thị trường ra toàn châu Á. Đến năm  2019, cuộc thi đã nhận được 7402 đơn đăng ký dự thi từ 151 quốc gia với hơn 1.2 tỉ USD vốn đầu tư được xúc tiến.

K-STARTUP GRAND CHALLENGE 2020
Startup Xtaypro đến từ Việt Nam đoạt giải 3 tại vòng chung kết K-Startup Grand Challenge 2018

Được tổ chức thường niên từ năm 2016 bởi Chính phủ Hàn Quốc, KSGC 2020 hướng tới thúc đẩy sự phát triển của các Startup tiềm năng thông qua việc đấu nối các nguồn lực hỗ trợ cần thiết và giúp các Startup mở rộng thị trường tại các nước châu Á với bước đệm là thị trường Hàn Quốc. Với cam kết đồng hành từ các công ty nổi tiếng toàn cầu của Hàn Quốc như Samsung, LG, Huyndai, Naver và Lotte,… các startup tham gia cuộc thi sẽ được tiếp cận với mạng lưới các cố vấn, nhà sáng lập, các chuyên gia và nhà đầu tư rộng khắp thế giới. 

“Dự án của chúng tôi đã phát triển vượt bậc kể từ khi bắt đầu tại Hàn Quốc. Chúng tôi đã thiết lập mối quan hệ với các nhà tài trợ và các thương hiệu lớn, cùng với đó là lượng truy cập website và người dùng tăng cao bất ngờ” – Hannah Waitt, CEO moonROK Media chia sẻ về những thành tựu đạt được sau khi tham gia cuộc thi KSGC 2019.

Năm 2020, Trung tâm Hợp tác CNTT Hàn Quốc tại Hà Nội (KICC), thuộc Cơ quan Xúc tiến Công nghiệp CNTT Hàn Quốc (NIPA) là đơn vị chịu trách nhiệm triển khai cuộc thi tại Việt Nam đã công bố các thông tin chi tiết về cách thức và quyền lợi dành cho các Startup tham gia. 

K-STARTUP GRAND CHALLENGE 2020
Năm 2019, giải thưởng dành cho đội quán quân là 100.000USD cùng nhiều cơ hội kể nối với các quỹ đầu tư và tập đoàn lớn trong khu vực

Đối tượng tham gia:

Dự án khởi nghiệp:

  • Có thời gian hoạt động dưới 7 năm
  • Có ít nhất 01 thành viên đôi ngũ sáng lập là người có quốc tịch tại 01 trong các quốc gia: Việt Nam, Lào, Myanmar, Campuchia, Philippin, HongKong và Đài Loan. 

Cách thức đăng ký:

Quyền lợi tham gia:

Giá trị giải thưởng:

  • Quán quân:  $120,000
  • Á quân: $60,000
  • Giải 3: $30,000 
  • Giải 4: $20,000 
  • Giải 5: $10,000

Các Startup tham gia cuộc thi có cơ hội:

  • Được kết nối với các quỹ đầu tư hàng đầu tại khu vực châu Á
  • Được nghiên cứu, phát triển, kiểm tra sản phẩm tại phòng nghiên cứu với các chuyên gia.
  • Được chính phủ Hàn Quốc hỗ trợ để định cư và thiết lập cơ sở kinh doanh tại Hàn Quốc 
  • Được sự tư vấn giúp đỡ tận tình từ các chuyên gia chuyên môn đến từ các tập đoàn lớn tại Hàn Quốc và châu Á.
  • Kết nối, hợp tác với các đối tác lớn tại thị trường Hàn Quốc.
  • Top 60 sẽ tham gia chương trình tăng tốc khởi nghiệp kéo dài 3.5 tháng tại Hàn Quốc (có kinh phí hỗ trợ lên đến 15.490 USD/đội) và trình bày sản phẩm trước các nhà đầu tư tại Demo Day 
  • Top 30 sẽ tham gia chương trình hỗ trợ thành lập tại Hàn Quốc kéo dài 3.5 tháng tiếp theo (có kinh phí hỗ trợ lên đến 15.490 USD/đội)

Cách thức nộp hồ sơ

  •  Thông tin chi tiết và đăng ký dự thi tại: https://www.ksgc2020.org/
  • Thời gian đăng ký dự thi: đến 25/06/2020

Mọi thắc mắc hoặc cần được hỗ trợ về cuộc thi, vui lòng liên hệ:

  • Điện thoại: 0788 900 406 (Ms.Vân)
  • Email: k.startupgc2020@gmail.com

Học lập trình Java cơ bản từ đâu và như thế nào?

hoc-lap-trinh-java

Đâu là những kiến thức cần có khi học lập trình java làm backend web developer? Để tìm hiểu và học Java bạn nên bắt đầu nắm vững những khái niệm cơ bản nhất. Từ đó khai triển lên kiến thức nâng cao hơn. Vậy các keyword chính khi học Java để trở thành một Java Web Developer là gì?

Java là một trong những ngôn ngữ bậc cao được nhiều công ty và các tổ chức trên thế giới tin dùng, ngôn ngữ Java được thiết kế vào những năm 90s bởi tổ chức Sun Micro system hiện nay thuộc sở hữu của Oracle. Java có tính độc lập rất cao, tiện lợi, có thể dùng cho việc cross-platform, có nghĩa bạn chỉ cần viết chương trình một lần thì có thể chạy trên nhiều nền tảng khác nhau. Khẩu hiệu kinh điển mà bất kỳ dân lập trình Java nào cũng biết đó là “Viết một lần, chạy được khắp nơi” (Write Once Run Anywhere).

Học Java căn bản thì bắt đầu từ đâu?

Để bắt đầu học lập trình Java, bạn phải cần thông thạo các ngôn ngữ lập trình hướng đối tượng, có thể học qua lập trình C để làm quen với những khái niệm của loại lập trình này cũng như có thể hiểu sâu hơn về Java và các công nghệ Java mà nhiều người thường sử dụng như:

  • Java Core
  • Enterprise Java Beans
  • JSP/Java Severlet
  • JDBC và RMI

Tham khảo thêm về công việc của Java developer tại đây

Java core

Nhắc đến Java backend developer chắc chắn phải nằm lòng kiến thức căn bản của ngôn ngữ lập trình java: JAVA CORE là kiến thức nền tảng của ngôn ngữ lập trình JAVA, nó sẽ là bước khởi đầu để bạn có thể học những kiến thức nâng cao như: JSP- Servlet – Android.

Java là ngôn ngữ lập trình hướng đối tượng (OOP)

Lập trình hướng đối tượng (OOP) là một kỹ thuật lập trình cho phép lập trình viên tạo ra các đối tượng trong code trừu tượng hóa các đối tượng. Đối tượng là những sự vật, sự việc mà nó có những tính chất, đặc tính, hành động giống nhau và ta gom góp lại thành đối tượng giống trong thực tế cuộc sống. Khi lập trình OOP, chúng ta sẽ định nghĩa các lớp (class) để gom (mô hình) các đối tượng thực tế.

Cách sử dụng câu điều kiện: if/else

Trong ngôn ngữ lập trình Java cũng như các ngôn ngữ lập trình khác, cấu trúc điều khiển if – else sẽ kiểm tra kết quả của 1 điều kiện và dựa vào kết quả đó để thực hiện các hành động tương ứng. Có bốn loại câu lệnh if trong java: Câu lệnh IF; Câu lệnh if -else; Câu lệnh if -else -if; Câu lệnh if lồng nhau.

Sử dụng vòng lặp: for/while

Vòng lặp for trong java được sử dụng để lặp một phần của chương trình nhiều lần. Nếu số lần lặp là cố định thì vòng lặp for được khuyến khích sử dụng, còn nếu số lần lặp không cố định thì nên sử dụng vòng lặp while hoặc do while. Có 3 kiểu của vòng lặp for trong java: Vòng lặp for đơn giản; Vòng lặp for cải tiến; Vòng lặp for gán nhãn.

Exception là gì và cách xử lý exception (xử lý ngoại lệ) trong Java

Exception trong Java được xem là một sự kiện làm gián đoạn luồng làm việc bình thường của chương trình đó. Nó là một đối tượng được ném ra tại runtime. Cụ thể là khi một chương trình đang chạy exception sẽ khiến nó lập tức dừng lại và xuất hiện thông báo lỗi. Một ví dụ trực quan nhất là khi bạn tiến hành thực hiện phép chia một số nguyên dương cho số 0 thì khi biên dịch chương trình sẽ làm phát sinh lỗi và đó được coi là ngoại lệ.

Checked Exception

Check Exception là các Exception xảy ra tại thời điểm Compile time (là thời điểm chương trình đang được biên dịch). Những Exception này thường liên quan đến lỗi cú pháp (syntax) và bắt buộc chúng ta phải “bắt” (catch) nó.

Unchecked Exception

Unchecked Exception được xem là các Exception xảy ra tại thời điểm Runtime (là thời điểm chương trình đang chạy). Những Exception này thường liên quan đến lỗi logic và không bắt buộc chúng ta phải “bắt” (catch) nó.

Các cấu trúc dữ liệu: chuỗi, mảng, HashMap, LinkedList

Đối với các ngôn ngữ lập trình, chuỗi và mảng là 2 kiểu dữ liệu rất quan trọng. Trong ngôn ngữ lập trình Java, chuỗi được coi là 1 dữ liệu dạng đối tượng (tức là nó có các thuộc tính và phương thức – chi tiết về đối tượng chúng ta sẽ được học trong chương Lập trình hướng đối tượng).

  HashMap hoạt động như thế nào trong java?

Trong lập trình Java, mảng (array) là một tập hợp các phần tử có cùng kiểu dữ liệu, có địa chỉ tiếp nhau trên bộ nhớ (memory). Mảng có số phần tử cố định và bạn không thể thay đổi kích thước của nó.. Mỗi phần tử của mảng được sử dụng như là một biến đơn, kiểu dữ liệu của mảng chính là kiểu dữ liệu của phần tử.

học lập trình Java

Mảng được sử khá nhiều, có tính ứng dụng cao không chỉ bởi sự đơn giản cũng như khả năng đáp ứng nhu cầu lưu trữ dữ liệu trong các bài toán thực tế. Các lập trình viên có nhiều kinh nghiệm thường sử dụng mảng khi cần lưu trữ nhiều giá trị, chẳng hạn như lưu trữ các số nguyên từ 1 đến 5; dãy 32 chuỗi ký tự v.v… 

Trong Java, mảng được hỗ trợ dưới dạng mảng một chiều cho đến mảng nhiều chiều. Tuy nhiên tối đa chỉ sử dụng mảng ba chiều và được dùng nhiều nhất là mảng một chiều.

Ví dụ về cách khai báo 1 mảng trong Java 

// Khai báo một mảng, chưa chỉ rõ số phần tử.
int[] array1;
 
// Khởi tạo mảng với 100 phần tử
// Các phần tử chưa được gán giá trị cụ thể
array1 = new int[100];
 
// Khai báo một mảng, và chỉ rõ số phần tử
// Các phần tử chưa được gán giá trị cụ thể
double[] array2 = new double[10];
 
// Khai báo một mảng với các phần tử được gán giá trị cụ thể.
// Mảng này có 4 phần tử
long[] array3= {10L, 23L, 30L, 11L};

Java còn là ngôn ngữ lập trình đa luồng multithreading

Trong Java có hai khái niệm multi: multithreading (đa luồng) và multitasking (đa tiến trình). Đa luồng khi chương trình đó có 2 luồng trở lên chạy song song với nhau và một luồng (thread) là đơn vị nhỏ nhất của tiến trình (process). Trong đó, luồng – đơn vị nhỏ nhất trong chương trình có thể thực hiện được một công việc riêng biệt, được quản lý bởi máy ảo Java. Bốn thành phần chính của một luồng bao gồm: định dang, một bộ đếm chương trình, một tập thanh ghi và ngăn xếp. Một ứng dụng Java ngoài luồng chính có thể có các luồng khác thực thi đồng thời. Với đa luồng, công việc của Java được xử lý nhanh chóng hơn.

Ví dụ khai báo mảng 2 chiều 

// Khai báo một mảng có 5 dòng, 10 cột
MyType[][] myArray1 = new MyType[5][10]; 
 
// Khai báo một mảng 2 chiều có 5 dòng.
// (Mảng của mảng)
MyType[][] myArray2 = new MyType[5][]; 
 
// Khai báo một mảng 2 chiều, chỉ định giá trị các phần tử. 
MyType[][] myArray3 = new MyType[][] {
 
    { value00, value01, value02 , value03 }, 
    { value10, value11, value12 } 
};
 
// ** Chú ý:
// MyType có thể là các kiểu nguyên thủy (byte, char, double, float, long, int, short, boolean)
// hoặc là kiểu tham chiếu.

>>> Xem thêm: 9 cách để xóa một phần tử ra khỏi JavaScript Array

Cấu trúc dữ liệu và giải thuật

Khi làm việc phía backend, Java developer cần thao tác nhiều với dữ liệu và làm sao để xử lý luồng dữ liệu nhanh nhất và chính xác nhất. 

Cấu trúc dữ liệu và giải thuật được xem là 2 yếu tố quan trọng trong lập trình. Data structure bao gồm 3 mức độ: cơ bản: stack (ngăn xếp), queue (hàng đợi), linkedlist (danh sách liên kết), binary tree (cây nhị phân); trung bình: Heap, Priority queue, Huffman Tree, Hash Table (Bảng băm); nâng cao: segment Tree, Binary Indexed Tree, Spare Table, ….

JSP và Servlet

Sau khi đã nắm vững các khái niệm Java core cùng cấu trúc dữ liệu và giải thuật, bạn sẽ cần học thêm về JSP và Servlet. Trong quá trình học, bạn sẽ biết đến J2EE, là nền tảng lập trình cho các ứng dụng phân tán (trong đó web chính là nền tảng dạng như ứng dụng phân tán), từ đó tiếp cận với các khái niệm mới như API, SML, JDBC, JMS.

Enterprise và Java Beans

Enterprise Java Beans (EJB) là một thành viên trong gia đình J2EE, là nền tảng có nhiệm vụ xây dựng các thành phần phần mềm có tính di động và có thể reusable (sử dụng lại). Từ đó các developer có thể xây dựng và triển khai các distributed application (ứng dụng phân tán) dễ dàng, thuận lợi hơn.

Đích đến của EJB là các enterprise (ứng dụng thương mại), lớn, phân tán. Từ đó, EJB có nhiệm vụ quy định kiến trúc và đặc tả cho việc phát triển và triển khai các component (thành phần) thuộc server-side của distributed application. Các component này được các tổ chức phát triển build ứng dụng hay được một bên thứ ba mua laị.

JDBC và RMI là gì?

học lập trình Java

  • JDBC là Java API có nhiệm vụ kết nối và thực hiện truy vấn database (cơ sở dữ liệu), sử dụng trình điều khiển JDBC để kết nối với database. Trước JDBC, ODBC được sử dụng để làm nhiệm vụ trên, tuy nhiên ODBC đuợc biết bằng nền tảng phụ thuộc (ngôn ngữ C) nên Java đã tự định nghĩa API của chính mình và sử dụng JDBC được viết trên nền tảng Java.
  • Java RMI (Remote Method Invocation – Gọi phương thức từ xa): một kỹ thuật của Java cài đặt distributed object (đối tượng phân tán) hiệu quả và linh động.
  • Một số đặc tính của RMI:
    • Là mô hình distributed object của Java, giúp truyền thông giữa các distributed object dễ dàng hơn.
    • API bậc cao xây dựng dựa trên lập trình socket.
    • Không những cho phép truyền data giữa các object trên các hệ thống khác nhau mà còn gọi được các phương thức trong các đối tượng remote.
    • Quá trình truyền data giữa các máy được xử lý trong suốt với Java virtual machine (máy ảo Java).
    • Cung cấp callback, cho phép Server gọi ngược phương thức ở Client.

Các framework của Java gồm những gì?

  • STRUTS
  • SPRINGS

Đây là hai framework khá lâu đời và được phát triển dựa trên nền tảng của J2EE, hỗ trợ việc xây dựng web bằng ngôn ngữ Java theo hướng MVC: viết tắt cho model view controller, một pattern khá nổi tiếng khi thiết kế phần mềm.

Trong quá trình học Springs/struts bạn cũng cần tìm hiểu về thư viện liên quan tới thao tác về mặt database trong ứng dụng S/S: JPA hay Hibernate. mvc

Ngoài ra chúng ta còn có 10 Framework tốt nhất dành cho Java mà bạn có thể bookmark ngay để tham khảo 

Lộ trình cơ bản của lập trình viên Java

Tham khảo lộ trình chi tiết khi học ngôn ngữ Java qua roadmap dưới đây:

học lập trình Java

Lượng kiến thức phải học Java để theo con đường web developer không phải là ít, cũng không thể hoàn thành trong một sớm một chiều. Cách nhanh nhất và học hiệu quả nhất của người theo đuổi Java Developer chính là định hướng rõ ràng, đặt mục tiêu và dành thời gian, công sức một cách nghiêm túc.

Các tài liệu lập trình Java từ căn bản nâng cao

Ngoài những nội dung như trên, TopDev xin được phép chia sẻ thêm một số tài liệu tiếng Anh và Việt dành cho những người mới cũng như những ai có kinh nghiệm về Java.

Tài liệu Java cơ bản của Đại Học Quốc Gia Hà Nội

Chú ý đây là giáo trình dành cho những người đã có một ít kiến thức về Java bao gồm 58 chương từ cơ bản đến nâng cao. Bạn có thể tự học bằng tại liệu này một cách rất dễ dàng.

Ngoài mục đích thực hành các nội dung liên quan đến lập trình hướng đối tượng, các bài tập thực hành của môn học này nên có thêm đóng vai trò định hướng và gợi ý giúp đỡ các lập trình viên tự học các chủ đề thuần túy Java, hiểu sâu những giá trị cốt lõi để có thể phát triển hơn trong tương lai.
Các thuật ngữ hướng đối tượng nguyên gốc tiếng Anh đã được chuyển sang tiếng Việt theo những cách khác nhau tùy các tác giả. lập trình viên cần biết thuật ngữ nguyên gốc tiếng Anh cũng như các cách dịch khác nhau đó để tiện cho việc sử dụng tài liệu tiếng Anh cũng như để liên hệ kiến thức giữa các tài liệu tiếng Việt. Vì lí do đó, giáo trình này cung cấp bảng thuật ngữ Anh-Việt với các cách dịch khác nhau tại Phụ lục C, bên cạnh Phụ lục A về công cụ lập trình JDK và Phụ lục B về tổ chức gói của ngôn ngữ Java

Blog học lập trình Java căn bản đến nâng cao đầy đủ nhất

Hơn hẳn những khóa học hàn lâm, học qua blog là một trong những cách thiết thực nhất giúp bạn có thể nắm được những kinh nghiệm được truyền từ những đàn anh đi trước. Hãy cùng xem qua những blog học lập trình Java mà bạn có thể tham khảo trực tiếp nhé.

Học trực tiếp từ Website của Java

Có lẽ việc học lập trình tốt nhất vẫn chính là học qua website chính thức của chính ngôn ngữ lập trình Java. Tại website chính thức của Java bạn cũng có thể được học trực tiếp từ những chuyên gia của họ, đồng thời tham gia các workshop cũng như webinar rất hữu ích.

Ngoài ra bạn cũng có thể tham khảo thêm những nội dung của trang FreeJavaGuide và trang laptrinhjavaweb, đây cũng là một trong những nơi có chứa đầy đủ nhất thông tin cho những ai cần tham khảo và tìm hiểu thông tin về lập trình Java.

Xem full chi tiết tài liệu tự học Java miễn phí chất lượng tại đây!

TopDev tổng hợp

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

7 năm làm dev có gì hay ho?

kinh-nghiem-lam-lap-trinh-vien

Đã bao giờ bạn tự hỏi bản thân rằng liệu mình có yêu thích công việc này hay không? Liệu mình có thể theo đuổi nó trong mỗi quãng thời gian dài hay không? Mình đã tự hỏi bản thân mình như thế mỗi sáng thức dậy, liệu mình đã chọn đúng công việc, đúng con đường hay chưa?

Mình là một lập trình viên – một công việc mà mọi người nhìn vào sẽ nghĩ tới một mức lương cao ngất ngưởng, một công việc rất là “ngầu”, một công việc mà ai cũng phải ngưỡng mộ. Hành trình làm một dev của mình bắt đầu từ năm 2012, với vị trí thực tập sinh C++. Thẳng thắn mà nói, mình thực sự không có một chút ý tưởng nào cho công việc mình đang làm vào thời điểm ấy. Với tâm lý của một thằng thực tập sinh vắt mũi chưa sạch mới đi làm lần đầu, mình thực sự không có một chút định hướng nào cho công việc của mình. Tuy nhiên, mình cũng đã cố gắng theo đuổi và trụ vững tới bây giờ đã được 7 năm. Hôm nay, mình xin chia sẻ lại với các bạn những kinh nghiệm làm lập trình viên quý báu mà mình nhận được thông qua con đường 7 năm này.

  Kinh nghiệm đọc tài liệu để trở thành Developer giỏi

  Bỏ túi những kinh nghiệm đi thực tập hay dành cho lập trình viên!

Thử đặt câu hỏi: Mình nên dùng ngôn ngữ nào để giao tiếp với mọi người?

7 năm làm dev có gì hay ho?

Đó là tiếng Anh? Tiếng Tây Ban Nha? Tiếng Trung? Hay là tiếng Nhật? Thời điểm đó mình đã ứng tuyển vào một công nước ngoài, trong công ty có rất nhiều nhân viên đến từ các nước khác nhau. Thực sự mình khá lo lắng đến việc phải dùng ngôn ngữ nào để giao tiếp với họ. Tiếng Anh? Okay Mình chọn ngôn ngữ phổ biến này, may mắn thay đó là ngoại ngữ duy nhất mà mình thành thạo.

Qua vấn đề về ngôn ngữ giao tiếp này, mình muốn khuyên các bạn rằng, khi ứng tuyển vào một công ty nào đó, bạn nên tìm hiểu kỹ môi trường làm việc để chuẩn bị sẵn cho mình tâm lý, cũng như những kỹ năng cần thiết nhất, nhất là vấn đề về ngôn ngữ. Nếu không thể giao tiếp với mọi người, hãy từ bỏ công việc đó. Công ty không thể thuê một nhân viên có thể làm việc nhưng “không thể nói” được.

Nói chuyện với mọi người thật sự còn quan trọng hơn cả nói chuyện với cái đống máy móc kia.

7 năm làm dev có gì hay ho?

Vẫn là vấn đề về giao tiếp, bạn không thể hoàn thành một dự án chỉ với 1 người. Trong một vài trường hợp đặc biệt nào đó, bạn có thể thấy một sản phẩm tuyệt vời nào đó được tạo ra chỉ bởi 1 người (CodeSandbox làm một ví dụ điển hình) nhưng trong phần lớn các trường hợp, một sản phẩm là sự chung sức của cả một tập thể – và điều bạn cần có đó là một team.

Hãy xem việc lập trình như là một môn thể thao, và team của bạn là một đội chơi. Sẽ xảy ra chuyện gì nếu các thành viên trong team không giao tiếp với nhau hay tệ hơn là họ muốn làm việc độc lập không chịu hợp tác ? Trễ deadine, hỏng dự án, cấp trên phê bình, … đó là những gì có thể dễ dàng tưởng tượng ra được nếu trong team bạn xuất hiện hiện tượng đó. Kỹ năng giao tiếp có thể giúp bạn tạo ra hoặc thậm chí là cũng có thể khiến bạn phá hủy cả một dự án. Vấn đề này hoàn toàn phụ thuộc vào cách giải quyết của bạn với mọi người trong team. Nếu không ai đứng ra giải quyết thì chính bạn là người phải có những biện pháp cải thiện vấn đề đó nếu muốn hoàn thành dự án một cách êm đẹp.

Thế mới nói, kỹ năng mềm chuyên nghiệp có thể trở nên quan trọng hơn so với một kỹ thuật nào đó trong sự thành công của một dự án.

Các bạn cần có một sự hiểu biết sâu sắc về những thứ bạn đang làm cũng như là hãy có những câu hỏi vì sao dành cho nó.

7 năm làm dev có gì hay ho?

Phần lớn mọi người đều sẽ cảm thấy thỏa mãn khi họ nhận thức được mục đích công việc họ đang làm. Áp dụng điều này trong công việc rất là đúng.

Bạn phải hiểu rằng, mục tiêu của các nhà phát triển đó là giải quyết được các vấn đề về code.

Nếu bạn sở hữu một kiến thức sâu rộng về hệ thống mà bạn đang xây dựng hoặc đang duy trì thì đó sẽ là một lợi thế cho bạn. Bạn có thể có những ý tưởng, những quyết định mang thiên hướng không theo lối mòn trước đây. Hãy thử đặt ra những câu hỏi như: chức năng này có thực sự cần thiết hay không? Đoạn code này đang xử lý cái gì? Vấn đề này có cần phải ưu tiên xử lý ngay từ đầu không?

Lối suy nghĩ này sẽ giúp ích cho bạn rất nhiều trong công việc. Nếu bạn muốn làm tốt công việc của mình thì các bạn không nên chỉ hiểu về mục đích của công việc mà còn phải biết định hình cũng như gây ảnh hưởng đến nó nữa. Hãy tận dụng ưu thế về kiến thức sâu rộng của bạn (nếu có) để vươn cao hơn trong công việc.

Nếu các bạn xem việc đánh giá code trong team của mình là một việc căng thẳng thì các bạn đang có lối suy nghĩ sai lầm rồi, thật sự rất sai lầm.

7 năm làm dev có gì hay ho?

Đối với một nhà phát triển, việc đưa code của mình ra cho cộng đồng đánh giá và thu lại những phản hồi thật sự là những trải nghiệm độc đáo. Cộng đồng có thể chê, có thể khen, có thể giúp bạn cải thiện cũng như tối ưu các đoạn code mà bạn tạo ra. Đừng lo lắng về những lời chê, tất cả mọi người đều có quyền lo lắng về những trải nghiệm của họ đối với sản phẩm, và những sản phẩm đó được tạo ra dưới bàn tay của bạn thì bạn phải có trách nhiệm đảm bảo cho họ có được một sự trải nghiệm tốt nhất có thể.

Bạn đánh giá code của các thành viên trong team và nhận thấy chức năng này hoàn toàn sai nhưng tất cả mọi người lại không có phản ánh gì.

Chúng ta cần một buổi gặp mặt riêng tư, hãy hẹn riêng một người nào đó trong team, nói chuyện và tìm hiểu lý do xem tại sao họ lại thực hiện đoạn code đó theo cách này.

Tất nhiên với tư cách là một nhà phát triển thì không ai muốn viết nên một đoạn code tệ hại cả. Nhưng nếu họ làm vậy, có lẽ họ đang mắc phải một số vấn đề gì đó mà bạn không biết. Nếu họ thật sự không giỏi trong việc lập trình ( có thể là chưa giỏi thôi nhé ), tới lúc cho bạn tỏa sáng dưới vai trò là một người cố vấn rồi đấy.

Một vài rắc rối sẽ xảy ra, hãy luôn trong tư thế chuẩn bị.

7 năm làm dev có gì hay ho?

Định luật Murphy có một câu ngạn ngữ rằng: “Bất cứ điều gì đó có thể sai sẽ trở thành sai.“

Câu nói đó thật sự rất đúng. Hãy luôn luôn cho rằng một cái đó sẽ xảy ra và phá hủy hệ thống mà bạn đang xây dựng.

Nếu bạn đang thiết kế một form đăng nhập, thử giả định rằng một người dùng nào đó sẽ sao chép và dán toàn bộ nội dung của một cuốn sách nào đó vào phần mật khẩu. Nghe thật tệ cho hệ thống của bạn.

Nếu bạn đang xây dựng một cửa sổ WYSSIWYG, thử tưởng tượng một người nào đó sẽ cố gắng phá hủy nó, và hãy xem như là họ sẽ thành công trong việc đó đi nhé.

Nếu bạn đang có một cơ sở dữ liệu, nó có thể sẽ sập nguồn ở một thời điểm nào đó. Trước đó bạn chưa từng thử phục hồi nó từ dữ liệu sao lưu, chuyện gì sẽ xảy ra? Dữ liệu sao lưu đó có chắc chắn là sẽ hoạt động tốt như bạn nghĩ ?

Hãy lường trước mọi rắc rối mà có thể xảy ra – trong khả năng của bạn, lên kế hoạch sẵn sàng cho những rắc rối đó. Tin mình đi, việc này không hề thừa thãi vô ích đâu.

Đừng sợ khi phải nói “Mình không biết”

7 năm làm dev có gì hay ho?

Điều tốt nhất khi bạn có một người cấp trên ở bên cạnh trong công việc đó là bạn có thể nói: “Mình không biết, mình chưa bao giờ thử nó trước đây. Mình sẽ xem xét lại và phản hồi sớm nhất lại cho bạn “

Khi mình còn là một junior, mình thực sự rất sợ khi phải nói “ Mình không biết “ về một vấn đề nào đó. Kết quả của nỗi sợ đó là gì, mình phải tốn thêm thời gian để tìm hiểu về các vấn đề mình không hiểu thay vì thú nhận với cấp trên là mình không biết gì về nó và cần họ giúp đỡ. Tin mình đi, không ai phê bình bạn khi bạn nói câu “ Mình không biết “ cả, trung thực sẽ tốt cả hai bên. Bạn hiểu được vấn đề nhanh hơn, đỡ mất thời gian, cấp trên thì đảm bảo dự án của họ sẽ được hoàn thành đúng hạn và chất lượng được đảm bảo.

Học từ cộng đồng

7 năm làm dev có gì hay ho?

Đã bao giờ bạn nghĩ bạn sẽ chia sẻ những kiến thức mình ra cho cộng đồng ? Bạn có tự tin là mọi kiến thức bạn biết là đã quá đủ ? Hãy thử viết blog, quay một video, hay tạo một sự kiện về chia sẻ kiến thức gì đó ở công ty hoặc thậm chí đơn giản là … chia sẻ kiến thức với một người bạn trong một buổi cà phê ngẫu hứng nào đó. Tin mình đi, kết quả thu về sẽ khiến bạn bất ngờ đấy, có thể sẽ xuất hiện ra những phản hồi thú vị nào đó, những thủ thuật hay ho mà bạn chưa hề biết, thậm chí là một phản bác nào đó khiến bạn phải chú ý và thảo luận với họ về nó. Học hỏi luôn là một điều tốt, nếu bạn nghĩ rằng phải có sự rõ ràng giữa cấp trên với cấp dưới thì hãy bỏ ngay đi nhé. Ngay cả những người cấp trên cũng có một cái gì đó để học hỏi từ những người mới bắt đầu và ngược lại.

Chỉ bảo là một hành động đáng để thử để thể hiện được sự đảm bảo về độ hiểu biết của bạn về chủ đề đang nói.

Và bây giờ, những bài học nào mà các bạn đã có được khi là một nhà phát triển?

Xem thêm việc làm Software Developers mới nhất trên TopDev

TopDev

[Trick] Lặp 1 video trên Youtube với thời gian theo ý muốn

lặp video trên youtube

Chả là dạo gần đây, tớ hay nghe bản nhạc “Một bước yêu vạn dặm đau” của bạn Chu Duyên. Xinh gái, hát hay, đàn lại giỏi.

Bạn có thể trải nghiệm ở link này: https://www.youtube.com/watch?v=plKgTyPXCAc

Nếu dùng loop mặc định của Youtube thì sẽ nghe đi nghe lại cả bài. Tuy nhiên, tớ chỉ thích nghe đoạn hát thôi, không thích nghe đoạn intro và outro ở đầu. Vì vậy tớ viết 1 đoạn script nho nhỏ, paste vào console để thực hiện thủ đoạn này, tiện share với mọi người luôn.

TL; DR

function simpleLoop(startTime, endTime) {
    // TODO: Check valid endtime
    console.log('-- Run here')
    var ytplayer = document.getElementById("movie_player");
    var currentTime = ytplayer.getCurrentTime();    
    var isRunToStart = currentTime > startTime
    var suitableTimeout = endTime - startTime


    if (currentTime <= startTime || currentTime > endTime){
        ytplayer.seekTo(startTime)
    } else {
        suitableTimeout = endTime - currentTime
    }
    console.log('>> Start timeout after: ', suitableTimeout * 1000)
    setTimeout(function () {
        simpleLoop(startTime, endTime)
    }, suitableTimeout * 1000)
}

simpleLoop(11, 254)

Thay trong hàm simpleLoop là startTime và endTime mà bạn muốn.

Giải thích

Đoạn code trên khá đơn giản, có thể hình dung theo sơ đồ sau:

Flow

Nếu thời gian hiện tại của video nhỏ hơn hoặc bằng thời gian bắt đầu, hoặc lớn hơn thời gian kết thúc của đoạn mà bạn muốn lặp => đang ở đoạn mà bạn không muốn nghe => phi trâu ngay đến đoạn bắt đầu + đặt thời gian timeout là 1 chu kì (endTime – startTime)

Ngược lại, nếu thời gian hiện tại đang ở đoạn muốn nghe, thời gian timeout sẽ là từ thời điểm hiện tại cho tới thời điểm kết thúc.

Sau khi tính toán được thời gian timeout, thực hiện gọi đệ quy lại chính hàm check này.

Lưu thành tool

Để cho tiện, tớ lưu lại thành tool vào thanh bookmark bar của chrome. Đoạn code dưới đây có thêm phần nhập vào start time và end time, để bạn có thể dễ dàng sử dụng Các bước lưu như sau:

  1. Lưu 1 bookmark bất kì
  2. Thay thế phần URL bằng đoạn code dưới đây
javascript: !function () {
    var oldValue = localStorage.getItem("simple_loop_" + location.href);
    var input = prompt("Time range: start,end", oldValue || "");
    var times = input.split(",");
    localStorage.setItem("simple_loop_" + location.href, input);
    if (times.length !== 2) {
        alert('Invalid format. Please check your input');
        return;
    }

    var startTime = parseInt(times[0]);
    var endTime = parseInt(times[1]);

    function simpleLoop(startTime, endTime) {
        console.log('-- Run here');
        var ytplayer = document.getElementById("movie_player");
        var currentTime = ytplayer.getCurrentTime();
        var suitableTimeout = endTime - startTime;


        if (currentTime <= startTime || currentTime > endTime) {
            ytplayer.seekTo(startTime);
        } else {
            suitableTimeout = endTime - currentTime;
        }
        console.log('>> Start timeout after: ', suitableTimeout * 1000);
        setTimeout(function () {
            simpleLoop(startTime, endTime);
        }, suitableTimeout * 1000);
    }

    simpleLoop(startTime, endTime);
}();

Mỗi khi sử dụng, bạn chỉ cần click vào bookmark, nhập thời gian muốn loop. Tớ có làm 1 video nhỏ để bạn xem trực quan hơn tại đây Make bookmark tool

Nếu bạn gặp lỗi trong quá trình sử dụng, hoặc thấy bài viết có gì sai sót, có điểm nào chưa tối ưu, hãy comment cho tớ biết nhé ^^

TopDev via MinhPhong306

Tìm hiểu validate form với HTML5

validate form với html5

Bài này nằm trong loạt bài chuẩn kiến thức để đi thi web mobile specialist của Google. Một số cách validate bằng HTML, sử dụng API kết hợp với javascript để custom lại theo ý muốn

Chúng ta cùng điểm qua các attribute mà HTML5 cung cấp để validate

type

Ngoài giá trị text, chúng ta sẽ có thêm

  • email: chỉ cho phép nhập địa chỉ email
  • number: chỉ cho phép nhập số
  • url: chỉ cho phép nhập dạng đường dẫn url
  • telkhông nên xài, vì mỗi nước của một kiểu format số điện thoại riêng
<form>
  <input name="your_email" type="email" />
  <input name="your_money" type="number" />
  <input name="your_website" type="url" />
  <button>Gửi</button>
</form>

Validate form với HTML5

required

Một attribute đơn giản nhất, truyền vào một giá trị boolean, bắt buộc user phải nhập giá trị nếu đang set true

<form>
  <label for="choose">Cafe hay Trà Đá?</label>
  <input id="choose" name="i_like" required>
  <button>Gửi</button>
</form>

Dùng CSS selector :valid:invalid để format cho element

input:invalid {
  border: 2px solid red;
}

input:valid {
  border: 2px solid black;
}

minlength, maxlength, min, max

Với <input type="number"/> chúng ta dùng min và max để đặt ràng buộc khoảng giá trị, các <input/><textarea/> còn lại dùng minlength và maxlength

<form>
  <div>
    <label for="choose">từ 3 đến 6 ký tự</label>
    <input id="choose" name="i_like" required minlength="3" maxlength="6">
  </div>
  <div>
    <label for="number">Từ 1 đến 10</label>
    <input type="number" id="number" name="amount" value="1" min="1" max="10">
  </div>
  <div>
    <button>Gửi</button>
  </div>
</form>

CSS selector cho giá trị của element :in-range:out-of-range

input:out-of-range {
  border: 2px solid red;
}

input:in-range {
  border: 2px solid black;
}

pattern

Truyền vào một regular expression, chỉ có trên <input/>không sử dụng được với <textarea/>

<form>
  <label for="choose">Bạn chỉ có thể nhập "cherry" hoặc "banana"</label>
  <input id="choose" name="i_like" required pattern="banana|cherry">
  <button>Gửi</button>
</form>

Ví dụ một số regular expression hay xài

Số điện thoại Việt Nam

<input
  type="text"
  pattern="(\+84|0)\d{9,10}" 
/>

Chỉ gồm số và chữ

<input
  type="text"
  pattern="[a-zA-Z0-9]+" 
>

Giá trị Hex Color như #3b5998 hoặc #000.

<input
  type="text"
  pattern="^#+([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$"
>

Gợi ý

Sử dụng title để hiển thị một tooltip cho user biết chúng ta muốn user nhập vào giá trị gì

<input
  type="text"
  name="phone"
  pattern="(\+84|0)\d{9,10}"
  title="Nhập số điện thoại từ 10 đến 11 số" 
/>

Validate form với HTML5

Customize câu hiển thị lỗi

Khi element invalid, nó sẽ hiện một câu thông báo kèm theo trên element, cái này phụ thuộc vào từng trình duyệt, không thể chỉnh lại bằng CSS, trình duyệt đang set ngôn ngữ gì thì nó hiển thị câu lỗi bằng ngôn ngữ đó, không đi theo ngôn ngữ khai báo của trang web.

Để thay đổi nội dung của câu thông báo, chúng ta buộc phải dùng javascript

Khá nhiều trình duyệt hiện tại cung cấp API để làm việc với validation, để đối phó với các trình duyệt cũ thì tất nhiên chúng ta dùng đến polyfill như Hyperform

Chúng ta cùng làm thử một custom error.

Đầu tiên là html

<form novalidate>
  <p>
    <label for="mail">
      <span>Vui lòng nhập địa chỉ email:</span>
      <input type="email" id="mail" name="mail">
      <span class="error" aria-live="polite"></span>
    </label>
  </p>
  <button>Gửi</button>
</form>

Chúng ta khai báo novalidate để tắt validate của trình duyệt.

Javascript sử dụng API của trình duyệt để tương tác với validate của HTML5

var form  = document.getElementsByTagName('form')[0];
var email = document.getElementById('mail');
var error = document.querySelector('.error');

email.addEventListener("input", function (event) {
  // kiểm tra khi user bắt đầu nhập
  if (email.validity.valid) {
    // nếu valid, remove
    error.innerHTML = ""; 
    error.className = "error"; 
  }
}, false);

form.addEventListener("submit", function (event) {
  // kiểm tra khi user click submit.
  if (!email.validity.valid) {
    error.innerHTML = "Baby à, cho anh địa chỉ email chứ";
    error.className = "error active";
    // chặn việc submit form
    event.preventDefault();
  }
}, false);

Demo

TopDev via Vuilaptrinh

6 xu hướng giúp định hình những nhà lãnh đạo nhân sự tương lai

Xu hướng

Trong cuốn sách mới nhất của mình mang tên The Future Leader dành cho người làm nhân sự nói chung, Jacob Morgan – một tác giả đồng thời là một diễn giả nổi tiếng đã có những chia sẻ:

“Một cuộc nghiên cứu nhỏ của tôi đã diễn ra với hơn 140 CEO trên toàn thế giới từ các tập đoàn, công ty như Audi, MasterCard, Unilever, Best Buy, Oracle, Kaiser, Verizon,…. Tôi khảo sát ở họ về sự xem xét những tố chất cần thiết để có thể trở thành một nhà lãnh đạo tài năng trong tương lai. Một trong những câu hỏi tôi đã hỏi tất cả các CEO này là theo họ, những xu hướng phát triển nào giúp định hình những nhà lãnh đạo về nhân sự.” 

Xu hướng

Đây là 6 xu hướng xác định những gì sẽ đóng vai trò chính trong việc định hình các nhà lãnh đạo tương lai trong thập kỷ tới và hơn thế nữa. Bài viết dưới đây nhằm mục đích phân tích để bạn có cái nhìn sâu sắc hơn về 6 xu hướng này.

AI – Trí tuệ nhân tạo và phát triển công nghệ

Như chúng ta biết, công nghệ đang phát triển với một tốc độ ngoạn mục. Cùng với nó là AI – Trí tuệ nhân tạo lại có sức mạnh biến đổi hoàn toàn cách thức hoạt động của doanh nghiệp và con người. Do đó, không có gì quá ngạc nhiên khi hầu hết các CEO đều cho rằng sự phát triển về AI và công nghệ là xu hướng phổ biến nhất, có tác động mạnh mẽ đến việc định hình những nhà lãnh đạo tương lai.

Xu hướng

Tuy nhiên, để thực hiện và có hướng phát triển đúng theo xu hướng này, các nhà quản lý nhân sự nên có sự triển khai và vận hành phù hợp. Đồng thời phải có niềm tin vào AI, tránh sự sợ hãi khi nghĩ rằng một ngày nào đó nó có thể thay thế hoàn toàn con người trong công việc. Bản thân các nhà lãnh đạo tương lai cần phải thành thạo về AI và sẵn sàng trải nghiệm việc áp dụng các công nghệ mới vào quy trình hợp thức hóa mô hình nhân sự của họ trước khi giúp các nhân viên hiểu được tác động tiềm năng của xu hướng này.

Chúng tôi sẽ thành công trong kỷ nguyên công nghệ số chỉ khi chúng tôi tham gia nhiệt tình và khuyến khích những sáng kiến, ý tưởng mới từ bản thân mình và cả những nhân viên về các vấn đề có liên quan. Tiếp cận AI và các công cụ công nghệ để phân tích nguồn dữ liệu là chuyện không của riêng ai.

“Lột xác” trong chiến lược & tiến trình thay đổi

Bên cạnh sự phát triển của AI và công nghệ chính là tốc độ thay đổi chung. Điều một nhà lãnh đạo tương lai cần làm chính là “lột xác” sao cho phù hợp trong tiến trình thay đổi đó. 

Để thành công, các nhà quản lý nhân sự tiềm năng cần nắm bắt nhiều vấn đề hơn về những cách thức tổ chức, vận hành hiện đại hóa hơn, vấn đề đa dạng công nghệ và toàn cầu hóa ngành nhân sự,.. thay vì chỉ tập trung vào một chuyên môn nhất định. Liên tục mong đợi và phải biết tự tạo cơ hội, thời cơ cho bản thân thay vì trốn tránh hoặc ngại đối diện với những thách thức mới trong tiến trình thay đổi. Ngoài ra, các nhà lãnh đạo tương lai cần phải nhanh nhẹn, dễ thích nghi và thoải mái với một môi trường nhiều tài năng về nhân sự.

Hiểu về mục đích và ý nghĩa

Xu hướng tìm việc với những kỳ vọng về một mức lương cao dường như đã quá cũ so với hiện tại. Vì thực tế trong ngành nhân sự hiện nay, nhân viên họ mong muốn làm việc cho một tổ chức cho họ nhận thấy được mục đích và ý nghĩa của công việc mình đang làm vì nó là những thứ có thể định hướng lâu dài trong sự nghiệp của họ; lương thật sự quan trọng nhưng để giảm cạnh tranh và thu hút nhân tài thì lương chưa thật sự là bước đi chính xác.

Xu hướng

Mục đích là lý do cho sự tồn tại của một tổ chức và thường bao gồm những thứ như đầu tư vào nhân viên, tạo sự khác biệt trên “sàn đấu” về nhân sự hoặc thúc đẩy sự đổi mới. Trong khi đó, ý nghĩa là tác động cá nhân trong công việc của mỗi nhân viên. Nhân viên luôn muốn thấy rằng những nỗ lực của họ có ảnh hưởng và tạo ra giá trị gì có thể đóng góp vào sự phát triển chung của công ty. Vì thế, để rèn luyện và phát huy tố chất của mình, các nhà lãnh đạo trước tiên phải hiểu công việc, mục đích, tác động và ý nghĩa của chính họ trước khi giúp nhân viên của họ nhận ra điều tương tự. Họ cần khai thác nhân viên của mình để hiểu được điều gì ở nhân viên họ cần phải thúc đẩy, tạo động lực.

Bối cảnh phát triển tài năng mới

Những năm gần đây đã mang lại sự thay đổi lớn về bối cảnh phát triển tài năng nói chung và dường như nó chỉ mới bắt đầu.

Khi các nhân viên lớn tuổi nghỉ hưu và các thế hệ trẻ gia nhập lực lượng lao động nhân sự, nhiều công ty thấy việc “săn lùng” và đào tạo các nhân viên lành nghề là điều rất thiết yếu. Đồng thời, sự đa dạng và hòa nhập đang trở nên quan trọng hơn. 

Bối cảnh tài năng mới không chỉ là thay đổi về nhân khẩu học; đó là một cách tiếp cận mới để thu hút và giữ chân nhân tài. Không những thế, tìm kiếm và tuyển chọn ra thế hệ nhân viên tài năng còn nhằm mục đích đào tạo và nâng cao chất lượng chuyên môn nhân sự của họ để sẵn sàng chuẩn bị cho công việc tương lai. Các nhà lãnh đạo của tương lai nên cố gắng phát triển các nhóm nhân viên đa dạng, cần đầu tư vào nguồn nhân lực trẻ, tạo ra một môi trường phù hợp để họ phát huy tính sáng tạo, tư duy đổi mới của mình. 

Đạo đức và tính minh bạch

Đạo đức và tính minh bạch được xem là là 2 yếu tố cần thiết để giúp bạn trở thành một nhà lãnh đạo tài năng. Việc tự thúc đẩy những phẩm chất này cũng chính là cách các nhà lãnh đạo rèn luyện cho mình sự chân thật và tính khiêm tốn. Các công ty có nền tảng về việc bồi dưỡng đạo đức tốt sẽ tạo được niềm tin giúp các nhân viên có thể đồng hành lâu dài. Đó cũng là lý do tại sao các nhà lãnh đạo nên tập trung vào vấn đề tổ chức xây dựng những chương trình, khóa học về rèn luyện kỹ năng sống cho nhân viên. 

Xu hướng

Bên cạnh đó, một nhà lãnh đạo tương lai cần có sự cởi mở, trung thực và tính minh bạch trong công việc và cách hành xử với nhân viên của mình. Hãy đánh giá một cách khách quan năng lực của nhân viên, cho họ những lời khuyên để họ nhận ra sự thiếu sót và khắc phục bản thân. Các nhà lãnh đạo cũng cần giữ vững lập trường của mình trong mọi chuyện, tránh cho nhân viên thấy rằng lãnh đạo của họ là một người cảm tính, dễ dàng thay đổi và không có sự kiên định. 

Vấn đề toàn cầu hóa

Khi công nghệ số phát triển, thế giới nhân sự có nhiều vấn đề phát sinh hơn. Đó là thách thức về toàn cầu hóa. Không thể phủ nhận, toàn cầu hóa mang đến cho chúng ta những cơ hội tuyệt vời để hợp tác với các tổ chức đầu ngành thông qua mạng lưới phát triển; tạo ra sự kết nối và chia sẻ văn hóa giữa các doanh nghiệp. Thế nhưng, việc nắm bắt được chính xác những chuyển biến trong xu thế toàn cầu hóa là điều khó khăn. Vì vậy, không còn cách nào khác là các nhà lãnh đạo nhân sự bắt buộc phải học hỏi và tiếp thu để trở thành những công dân toàn cầu, những người đánh giá cao các nền văn hóa khác nhau và biết cách giao tiếp qua các rào cản về văn hóa và ngôn ngữ. Việc quan tâm đến vấn đề toàn cầu, hiểu về cơ hội, thách thức và những gì đang diễn ra trên trong thế giới nhân sự là bước đi đầu trên hành trình trở thành nhà lãnh đạo tương lai.

Lời kết

Nếu mong muốn tiến xa trong tương lai, những nhà lãnh đạo của hiện tại với chuyên môn và các tố chất sẵn có cần cần hiểu được xu hướng và điều chỉnh phương pháp lãnh đạo của họ để thay đổi cách sống, suy nghĩ, làm việc. 6 xu hướng này có ý nghĩa quan trọng đối với việc thay đổi đồng thời tạo ra các nhà lãnh đạo tiềm năng trong tương lai. 

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

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

 

 

Onsite là gì? Lập trình viên đi onsite cần biết những gì?

Onsite là gì? Lập trình viên đi onsite cần biết những gì?

Một khi chọn trở thành lập trình viên, bạn có rất nhiều lựa chọn: làm việc cho các công ty product để xây dựng sản phẩm nội bộ, hoặc các công ty outsourcing cho các sản phẩm của đối tác. Tuy nhiên có một thuật ngữ mặc dù đã quen với các bạn đã đi làm nhưng vẫn khá lạ so với đại đa số người mới. Đó là: Onsite

Onsite là gì?

Onsite là làm việc cho khách hàng – thay vì làm việc cho doanh nghiệp đã ký hợp đồng ban đầu. Các bạn sẽ được thử thách tại các doanh nghiệp khác với các dự án lớn cần nhiều người tham gia. Điều kiện ở đây là lập trình viên phải có kinh nghiệm hay ít nhất cũng biết những việc cơ bản mà không cần đào tạo thêm.

Ví dụ về Onsite

Chẳng hạn khi Công Ty KMS triển khai một dự án với quy mô lớn, họ sẽ tuyển thêm nhiều lập trình viên từ các công ty cho thuê coder nhằm đảm bảo tiến độ dự án, tiết kiệm chi phí và nhân lực.

Các công ty hoặc tập đoàn nước ngoài sẽ có nhu cầu rất nhiều trong việc thuê onsite. Lập trình viên sẽ có cơ hội ra nước ngoài, tiếp xúc với những nền văn hóa mới và phương thức làm việc cũng khác. Thường thì các quốc gia đó sẽ là Singapore, Nhật Bản, Hàn Quốc, Mỹ, …

Việc đi làm onsite là mơ ước của khá nhiều anh em lập trình, nhất là các bạn vừa ra trường, muốn khám phá thế giới đi làm như thế nào, tiếp xúc với môi trường chuyên nghiệp hay văn hóa của một doanh nghiệp nào đó.

Onsite được gì?

  1. Kiến thức: Dân IT đi onsite luôn được trang bị những kiến thức cơ bản nhất nhằm phục vụ cho dự án mới. Bạn sẽ nhận rất nhiều kiến thức khi tham gia một dự án lớn với quy mô hàng trăm, hàng ngàn người. Vậy nên đó là thứ dễ nhận thấy nhất.
  2. Kinh nghiệm: phải đối mặt và giải quyết những vấn đề chưa từng gặp phải, vấn đề hóc búa và phải giải quyết chúng một cách nhanh chóng cho kịp tiến độ, biết cách phòng tránh lỗi trong quá trình làm việc, biết cách fix lỗi và cho ra đời sản phẩm kịp tiến độ. Ngoài ra, kỹ năng mềm và cách thức giám sát, đôn đốc dự án là những gì bạn chẳng thể học được khi còn ngồi trên ghế nhà trường.
  3. Môi trường mới: anh em lập trình viên sẽ được làm quen với những con người mới, cách làm việc mới, văn hóa doanh nghiệp mới… tạo cho bạn những thói quen mới chuyên nghiệp hơn.
  4. Ngôn ngữ mới: Cho dù bạn onsite trong nước hay nước ngoài thì ngoại ngữ là thứ bạn rất cần trau dồi thêm để công việc thêm thuận tiện hơn. Sẽ có những lúc bạn bơ vơ tại xứ người, không có một người bạn nào ở bên bạn sẽ nhận ra tầm quan trọng của ngoại ngữ. Trong công việc cũng vậy, bạn giao tiếp được, hiểu được ý định thì sẽ code nhanh hơn so với nhờ phiên dịch.
  5. Cơ hội thăng tiến: Hãy tận dụng khoảng thời gian này để hoàn thiện bản thân, tích lũy những kinh nghiệm dù là nhỏ nhặt nhất. Với những kinh nghiệm hay phong cách làm việc chuyên nghiệp khi tiếp xúc với đối tác lớn, bạn sẽ dễ dàng thăng tiến một cách nhanh chóng.

Vậy Onsite mất gì?

  1. Mối quan hệ: liên tục thay đổi đồng nghiệp, môi trường, nơi ở.
  2. Thời gian: Để kịp tiến độ, bạn sẽ phải hoàn thành nhiều việc một lúc, OT ngày đêm và chẳng còn thời gian cho bản thân, cho gia đình.
  3. Quyền lợi: Đó là các phúc lợi như team building, các lớp học thêm hay lâu lâu không được tính lương OT cũng là những khó khăn cần vượt qua.

Kết luận

Tất nhiên, cái gì cũng có hai mặt của nó. Onsite là cơ hội cho bạn được rất nhiều về kiến thức và kinh nghiệm cũng như thực hành những kĩ năng mềm tốt nhất. Đó là thực hành cách giao tiếp với những con người hoàn toàn xa lạ, cách đàm phán mang lại hiệu quả cho bạn, là cách sắp xếp quản lý thời gian để bạn tránh bị cuốn vào mớ task hỗn độn. Nếu như may mắn thì rất có thể bạn được cử đi làm onsite tại nước ngoài vì vậy việc trau dồi ngoại ngữ cho mình là điều cực kỳ tốt.

Bạn sẽ tiết kiệm được một khoản nho nhỏ từ khoản tiền đi làm onsite, cho những kế hoạch học tập, mua sắm, du lịch của bạn hay cũng có thể là mở công ty startup.

Cái mất của đi làm onsite cũng có những hạn chế nhất định khi đi onsite bạn chính là bộ mặt của công ty làm việc trực tiếp với khách hàng, điều đó cũng phần nào tạo nên áp lực đối với bạn. Bạn sẽ phải nỗ lực nhiều hơn, bắt nhịp nhanh hơn để làm tốt vai trò của mình nên nó cũng sẽ ngốn rất nhiều thời gian của mình. Tuy nhiên được lại nhiều hơn mất, còn trẻ thì ngại gì xông pha đúng không các bạn.

Tìm danh sách vị trí và công ty có cơ hội đi onsite nước ngoài tại đây nhé.

  Vì sao onsite nước ngoài được xem là điểm sáng trong sự nghiệp?

Những góc khuất “đeo bám” người làm nghề lập trình

Lập trình

Trong bài viết trước, mình đã giới thiệu vài nét cơ bản về nghề lập trình website. Bài này chúng ta sẽ cùng cưỡi ngựa xem hoa, ngắm nhìn những vấn đề hóc búa trong nghề, qua những kinh nghiệm chia sẻ của những người đi trước cùng thông tin cập nhật thực tế trong cộng đồng. Hy vọng giúp ích cho các bạn mới tìm hiểu về nghề lập trình, cũng như đón nhận những góp ý thảo luận từ các bạn nhiều kinh nghiệm, nhằm chia sẻ bí quyết để tồn tại trong nghề, hạnh phúc với nghề và lên tới mức yêu nghề.

Tiền hay Đam Mê

Để theo đuổi mục tiêu nghề nghiệp đúng hướng, bạn cần xác định rõ ràng động lực chính của bản thân.

Ở đây chúng ta sẽ đi tìm lời giải đáp cho câu hỏi: “Bạn làm nghề lập trình vì đam mê hay kiếm tiền?”.

Tiền nong luôn là việc hệ trọng, làm gì hay ở đâu cũng vậy, muốn sống được thì phải có tiền trước đã, công việc lập trình có nhiều cách để kiếm tiền. Còn sở thích đam mê? Cũng quan trọng không kém, nhất là trong ngành Công nghệ thông tin (CNTT) với áp lực và thử thách cao độ.

Xin hãy thật sự nghiêm túc khi nhìn nhận vấn đề này, vì mỗi câu trả lời tuy của cá nhân, nhưng khi gộp lại theo cấp số nhân của hàng trăm người, của cả giới trẻ, hết thảy người lao động… Thì nó sẽ nói lên nhiều điều về vận mệnh của cả quốc gia.

Trong các diễn đàn khảo sát, mình thấy đa phần câu trả lời là tiền. Những bạn đồng nghiệp, bạn chung trường đại học của mình cũng sẵn sàng nhảy việc khi có mức lương cao hơn.

Thử hình dung khi tất cả chúng ta đều có mục đích lao động là tiền thì liệu mình có thể vượt qua được “lao động nước người ta” lao động vì đam mê?

Có ý kiến thông minh hơn, cho rằng cả hai Đam Mê và Tiền là mục tiêu chính trong công việc ta cần hướng tới, vì cả hai thứ tưởng chừng đối lập ấy lại gắn bó mật thiết vô cùng. Nếu bạn làm công việc yêu thích nhưng quá ít tiền, không đủ sống hay có lương cao nhưng công việc lại quá chán ngắt, cũng khó theo đuổi tới cũng.

Đó cũng là tiêu chí khi xem xét đầu quân vào công ty:

– Công ty A lương cao (điểm 10), công việc hơi tẻ nhạt (điểm 4)
– Công ty B lương vừa (điểm 7), công việc thú vị (điểm 8)

Bạn thông minh trên sẽ chọn công ty B, bạn mê tiền sẽ chọn công ty A.

Ý kiến của tác giả: chìa khóa để chọn Tiền hay Đam mê là Thời điểm.

  • Thời điểm mới ra trường: đam mê ưu tiên hơn, chấp nhận lương ít trong 1 năm đầu.
  • Thời điểm đã có 2-5 năm kinh nghiệm: ưu tiên kiếm tiền, xứng đáng công sức mình bỏ ra.
  • Thời điểm lâu dài hơn: ưu tiên lại đam mê, bạn không thể làm việc lớn nếu chỉ nghĩ tới tiền, tham gia khởi nghiệp thứ phải hy sinh đầu tiên chính là tiền đâu.

Ý kiến của 1 thanh niên giấu tên cho hay: “Bitch, shut up! Tao đi làm không vì tiền cũng không vì đam mê, anh đi làm vì cơ hội thăng tiến thì sao?”.
Vậy sau khi thăng tiến lên làm Leader chẳng hạn, lúc đó anh đòi lương cao hay là sự thích thú trong công việc? Chắc chắn anh sẽ phải chọn tiếp 1 trong 2 nhu cầu Tiền và Đam Mê, không tránh khỏi cho dù mục tiêu ngắn hạn của anh có là Cơ hội đi chăng nữa.

Ý kiến của các bậc vĩ nhân:

Bill Gates

Ta làm việc vì tiền, mọi thứ tuyệt vời nhất, phần mềm, hợp đồng kinh doanh… Đều vì mục đích tiền. Đam mê của ta là đam mê tiền, động lực vì tiền của ta gắn thêm động cơ đam mê nữa nên chạy với vận tốc ánh sáng.

Steve Jobs

Ta làm vì đam mê, ta chưa bao giờ thèm để tâm tới tiền bạc cả. Vì thế trong những hoàn cảnh vô cùng cơ cực, ta vẫn viết lên lịch sử nhờ sự đam mê. Tiền cũng được mà đam mê cũng được, miễn sao những động lực này đủ mạnh mẽ để tiếp sức cho bạn hằng ngày, vượt qua mọi khó khăn trong công việc. Còn hơn 1 anh thiếu động lực thì mới bị sếp nhắc nhở, đồng nghiệp lớn tiếng mà đã vội viết thư nghỉ việc.

kinh nghiệm lập trình viên

Chuyện chất xám

Lại thêm một chủ đề đáng quan tâm trong nghề lập trình mà được các bạn tranh luận vô cùng sôi nổi. Khi Việt Nam đang dần trở thành cái xưởng gia công phần mềm của thế giới, tới mức đứng top 6. Người thì lạc quan vì chúng ta tăng tỉ lệ lao động kỹ thuật cao, kẻ thì chua xót vì chúng ta xứng đáng được hơn thế, trí tuệ Việt trước giờ luôn được thế giới khâm phục.

Qua bài viết Đầu quân công ty Outsourcing, Product hay Startup, bạn sẽ hiểu thêm về các dạng công ty phần mềm hiện nay. Tuy nhiên chọn như thế nào? Bạn có cho rằng làm việc cho công ty gia công (outsourcing) của nước ngoài là đang “bán rẻ rúng” sức lao động? Vậy nên bạn ráng học tiếng anh và xin ra nước ngoài làm luôn mới là bán sức lao động “đúng giá”? Hay là vào làm cho công ty nhà nước để cống hiến tuổi trẻ và nhiệt huyết miễn phí? Hay làm khởi nghiệp để được bán sức cho dân ta tình thương mến thương?
Với các bạn chuẩn bị ra trường không nên phân vân những điều này vội. Thật ra sức lao động hay chất xám gì đó, nó có giá trị khi được liên tục mài giũa và tôi luyện, thông qua công việc, kinh nghiệm, học hỏi. Ví dụ anh Tèo làm việc kinh nghiệm 10 năm thì lương cao hơn anh Tí mới ra trường, chứ có biết anh Tèo bán chất xám ở chợ đầu mối nào đâu. Vậy nên, hiện tại bạn chỉ cần tìm 1 môi trường thích hợp, có thật nhiều động lực, và làm việc thật chăm chỉ. Chuyện bán chất xám cho ai không quan trọng bằng bán mà không ai thèm mua.

Tuổi nghề lập trình

Làm lập trình viên dễ xin việc, lương cao thì ai cũng biết, nhưng chuyện tuổi nghề của lập trình viên ngắn thì không phải ai cũng nhận thấy. Lập trình là công việc đòi hỏi sự tập trung, óc nhanh nhạy, do đó tuổi đời càng trẻ trung năng động càng tốt, đây cũng là một đặc tính khá bạc bẽo của nghề mà bạn nên chấp nhận. Nếu như các ngành nghề khác như Bác sĩ, Giáo viên, Luật sư… Càng làm lâu năm bạn càng nhiều kinh nghiệm và càng được có vai vế trong nghề, nhưng với lập trình, kinh nghiệm sẽ mau chóng lạc hậu, chỉ có sự học hỏi nhanh, nắm bắt công nghệ mới là yếu tố quyết định.

Tuy nhiên, ngành CNTT rất rộng, bạn vẫn có thể chuyển từ công việc lập trình sang các công việc khác ưu tiên kinh nghiệm hơn như: phân tích thiết kế, xây dựng kiến trúc hệ thống, chuyên gia kỹ thuật, quản lý dự án…Nếu có năng lực, các bạn có thể làm CNTT cả đời.

Kết thúc

Trong đầy rẫy những bài viết miêu tả nghề lập trình trên mạng do cánh nhà văn, nhà thơ theo trường phái lãng mạng viết, mình nửa đêm vỗ gối, nước mắt đầm đìa, ngồi cong đít viết lên bài này, góp nhặt những vấn đề chua cay trong ngành lập trình phần mềm, hy vọng có một cái nhìn thực tế hơn dành cho những ai thật sự quan tâm và muốn theo đuổi con đường lập trình, mong đón nhận được ý kiến độc giả dưới phần bình luận để góp phần giúp bài viết được đầy đủ hơn.

TopDev via namluu

  Cách mà một dòng code đã thay đổi cuộc đời tôi!

  15 chứng chỉ "vàng" đáng giá trong ngành lập trình

Elasticsearch là gì? Tìm hiểu về Elasticsearch

elasticsearch-la-gi

Elasticsearch là gì?

Elasticsearch là gì? – là một công cụ tìm kiếm dựa trên nền tảng Apache Lucene. Nó cung cấp một bộ máy tìm kiếm dạng phân tán, có đầy đủ công cụ với một giao diện web HTTP có hỗ trợ dữ liệu JSON.

Elasticsearch được phát triển bằng Java và được phát hành dạng nguồn mở theo giấy phép Apache.

Chi tiết về Elasticsearch là gì? (ES)

  • Elasticsearch là một search engine.
  • Elasticsearch được kế thừa từ Lucene Apache
  • Elasticsearch thực chất hoặt động như 1 web server, có khả năng tìm kiếm nhanh chóng (near realtime) thông qua giao thức RESTful
  • Elasticsearch có khả năng phân tích và thống kê dữ liệu
  • Elasticsearch chạy trên server riêng và đồng thời giao tiếp thông qua RESTful do vậy nên nó không phụ thuộc vào client viết bằng gì hay hệ thống hiện tại của bạn viết bằng gì. Nên việc tích hợp nó vào hệ thống bạn là dễ dàng, bạn chỉ cần gửi request http lên là nó trả về kết quả.
  • Elasticsearch là 1 hệ thống phân tán và có khả năng mở rộng tuyệt vời (horizontal scalability). Lắp thêm node cho nó là nó tự động auto mở rộng cho bạn.
  • Elasticsearch là 1 open source được phát triển bằng Java

Các công ty lớn đang sử dụng

  • Wikimedia
  • athenahealth
  • Adobe Systems
  • Facebook
  • StumbleUpon Mozilla,
  • Amadeus IT Group
  • Quora
  • Foursquare
  • Etsy
  • SoundCloud
  • GitHub
  • FDA
  • CERN
  • Stack Exchange
  • Center for Open Science
  • Reverb
  • Netflix
  • Pixabay
  • Motili
  • Sophos
  • Slurm Workload Manager

Elasticsearch hoạt động như thế nào?

elasticsearch là gì

Sau khái niệm Elasticsearch là gì, thì chúng ta lại tiếp tục tìm hiểu hoạt đông của Elasticsearch, đó là 1 server riêng biệt để “phục vụ” việc tìm kiếm dữ liệu. ES sẽ chạy một cổng (dưới local default là 9200). Người ta cũng có thể dùng ES là DB chính nhưng thường không ai làm thế vì cái gì cũng có nhiệm vụ riêng biệt của nó.

ES không mạnh trong các thao tác CRUD, nên thường sẽ dùng song song với 1 DB chính (SQL, MySQL, MongoDB …)

Tại sao nên sử dụng Elasticsearch?

Tại sao phải dùng ES trong khi tìm kiếm văn bản có thể sử dụng câu lệnh LIKE SQL cũng được?

Nếu search bằng truy vấn LIKE “%one%” thì kết quả sẽ chỉ cần chứa “one” là ra. Ví dụ: “phone”, “zone”, “money”, “alone” … nói chung sẽ là 1 list kết quả không mong muốn.

Còn search bằng ES thì gõ “one” sẽ chỉ có “one” được trả về mà thôi. Truy vấn LIKE không thể truy vấn từ có dấu. Ví dụ: từ khoá có dấu là “có”, nếu truy vấn LIKE chỉ gõ “co” thì sẽ không trả về được chính xác kết quả Về Perfomance thì ES sẽ là tốt hơn, truy vấn LIKE sẽ tìm kiếm đơn thuần toàn văn bản không sử dụng index, nghĩa là tập dữ liệu càng lớn thì tìm kiếm càng lâu, trong khi ES lại “đánh index” cho các trường được chọn để tìm kiếm.

Tham khảo việc làm RESTful API lương cao cho bạn

Các khái niệm cần biết

1. Document trong Elasticsearch là gì?

Document là một JSON object với một số dữ liệu. Đây là basic information unit trong ES. Hiểu 1 cách cơ bản thì đây là đơn vị nhỏ nhất để lưu trữ dữ liệu trong Elasticsearch.

2. Index

Index có lẽ là một khái niệm quá quen thuộc đối với các anh em dùng Mysql rồi. Tuy nhiên index trong ES hoàn toàn khác trong Mysql.

Trong Elasticsearch , sử dụng một cấu trúc được gọi là inverted index . Nó được thiết kế để cho phép tìm kiếm full-text search. Cách thức của nó khá đơn giản, các văn bản được phân tách ra thành từng từ có nghĩa sau đó sẽ đk map xem thuộc văn bản nào. Khi search tùy thuộc vào loại search sẽ đưa ra kết quả cụ thể.

VÍ dụ : Chúng ta có 2 văn bản cụ thể như sau :

1,The quick brown fox jumped over the lazy dog
2,Quick brown foxes leap over lazy dogs in summer

Để tạo ra một inverted index, trước hết chúng ta sẽ phân chia nội dung của từng tài liệu thành các từ riêng biệt (chúng tôi gọi là terms), tạo một danh sách được sắp xếp của tất cả terms duy nhất, sau đó liệt kê tài liệu nào mà mỗi thuật ngữ xuất hiện. Kết quả như sau:

Term      Doc_1  Doc_2
-------------------------
Quick   |       |  X
The     |   X   |
brown   |   X   |  X
dog     |   X   |
dogs    |       |  X
fox     |   X   |
foxes   |       |  X
in      |       |  X
jumped  |   X   |
lazy    |   X   |  X
leap    |       |  X
over    |   X   |  X
quick   |   X   |
summer  |       |  X
the     |   X   |
------------------------

Bây giờ, nếu chúng ta muốn tìm kiếm màu quick brown, chúng ta chỉ cần tìm trong các tài liệu trong đó mỗi thuật ngữ có xuất xuất hiện hay không. Kết quả như sau:

Term      Doc_1  Doc_2
-------------------------
brown   |   X   |  X
quick   |   X   |
------------------------
Total   |   2   |  1

Như các bạn đã thấy, cả 2 đoạn văn bản đều thích hợp với từ khóa. Tuy nhiên có thể dễ dàng nhận ra rằng Doc_1 chính xác hơn nhiều.

Bạn hoàn toàn có thể setup việc tìm kiếm 1 cách kỹ càng hơn, tuy nhiên minh sẽ đề cập đến vấn đề này trong bài viết sau nhé. Nếu bạn có hứng thú có thể vào tài liệu https://www.elastic.co/guide/en/elasticsearch/guide/current/inverted-index.html và https://www.elastic.co/guide/en/elasticsearch/guide/current/relevance-intro.html#relevance-intro để có cái nhìn rõ ràng hơn .

elasticsearch là gì

3. Shard

  • Shard là đối tượng của Lucene , là tập con các documents của 1 Index. Một Index có thể được chia thành nhiều shard.
  • Mỗi node bao gồm nhiều Shard . Chính vì thế Shard mà là đối tượng nhỏ nhất, hoạt động ở mức thấp nhất, đóng vai trò lưu trữ dữ liệu.
  • Chúng ta gần như không bao giờ làm việc trực tiếp với các Shard vì Elasticsearch đã support toàn bộ việc giao tiếp cũng như tự động thay đổi các Shard khi cần thiết.
  • Có 2 loại Shard là : primary shard và replica shard.

3.1 : Primary Shard

  • Primary Shard là sẽ lưu trữ dữ liệu và đánh index . Sau khi đánh xong dữ liệu sẽ được vận chuyển tới các Replica Shard.
  • Mặc định của Elasticsearch là mỗi index sẽ có 5 Primary shard và với mỗiPrimary shard thì sẽ đi kèm với 1 Replica Shard.

3.2 : Replica Shard

  • Replica Shard đúng như cái tên của nó, nó là nơi lưu trữ dữ liệu nhân bản của Primary Shard
  • Replica Shard có vai trò đảm bảo tính toàn vẹn của dữ liệu khi Primary Shardxảy ra vấn đề.
  • Ngoài ra Replica Shard có thể giúp tăng cường tốc độ tìm kiếm vì chúng ta có thể setup lượng Replica Shard nhiều hơn mặc định của ES
  Instant AJAX Search với Laravel và Vuejs

4. Node

  • Là trung tâm hoạt động của Elasticsearch. Là nơi lưu trữ dữ liễu ,tham gia thực hiện đánh index cúa cluster cũng như thực hiện các thao tác tìm kiếm
  • Mỗi node được định danh bằng 1 unique name

5. Cluster

  • Tập hợp các nodes hoạt động cùng với nhau, chia sẽ cùng thuộc tính cluster.name. Chính vì thế Cluster sẽ được xác định bằng 1 ‘unique name’. Việc định danh các cluster trùng tên sẽ gây nên lỗi cho các node vì vậy khi setup các bạn cần hết sức chú ý điểm này
  • Mỗi cluster có một node chính (master), được lựa chọn một cách tự động và có thể thay thế nếu sự cố xảy ra. Một cluster có thể gồm 1 hoặc nhiều nodes. Các nodes có thể hoạt động trên cùng 1 server .
  • Tuy nhiên trong thực tế , một cluster sẽ gồm nhiều nodes hoạt động trên các server khác nhau để đảm bảo nếu 1 server gặp sự cố thì server khác (node khác) có thể hoạt động đầy đủ chức năng so với khi có 2 servers. Các node có thể tìm thấy nhau để hoạt động trên cùng 1 cluster qua giao thức unicast.

Chức năng chính của Cluster đó chính là quyết định xem shards nào được phân bổ cho node nào và khi nào thì di chuyển các Cluster để cân bằng lại Cluster

Ưu nhược điểm của ES

Ưu điểm

  • Tìm kiếm dữ liệu rất nhanh chóng, mạnh mẽ dựa trên Apache Lucene ( near-realtime searching)
  • Có khả năng phân tích dữ liệu (Analysis data)
  • Khả năng mở rộng theo chiều ngang tuyệt “vòi”
  • Hỗ trợ tìm kiếm mờ (fuzzy), tức là từ khóa tìm kiếm có thể bị sai lỗi chính tả hay không đúng cú pháp thì vẫn có khả năng elasticsearch trả về kết quả tốt.
  • Hỗ trợ Structured Query DSL (Domain-Specific Language ), cung cấp việc đặc tả những câu truy vấn phức tạp một cách cụ thể và rõ ràng bằng JSON.
  • Hỗ trợ nhiều Elasticsearc client như JavaPhPJavascriptRuby.NETPython

Nhược điểm

  • Elasticsearch được thiết kế cho mục đích search, do vậy với những nhiệm vụ khác ngoài search như CRUD thì elastic kém thế hơn so với những database khác như Mongodb, Mysql …. Do vậy người ta ít khi dùng elasticsearch làm database chính, mà thường kết hợp nó với 1 database khác.
  • Trong elasticsearch không có khái niệm database transaction , tức là nó sẽ không đảm bảo được toàn vẹn dữ liệu trong các hoạt độngInsertUpdateDelete.Tức khi chúng ta thực hiện thay đổi nhiều bản ghi nếu xảy ra lỗi thì sẽ làm cho logic của mình bị sai hay dẫn tới mất mát dữ liệu. Đây cũng là 1 phần khiến elasticsearch không nên là database chính.
  • Không thích hợp với những hệ thống thường xuyên cập nhật dữ liệu. Sẽ rất tốn kém cho việc đánh index dữ liệu.

Cài đặt ElasticSearch

Yêu cầu

Elasticsearch yêu cầu Java 8 trở lên và phải thiết lập biến môi trường JAVA_HOME cho java, do đó trước khi cài Elasticsearch, hãy chắc chắn rằng bạn đã cài Java version >= 8 trên máy.

Kiểm tra bằng lệnh java -version để biết máy máy mình đã cài Java chưa và phiên bản Java đang cài là bao nhiêu. Kiểm tra biến môi trường JAVA_HOME đã được thiết lập chưa bằng lệnh: echo $JAVA_HOME

Cài đặt

Download và cài đặt Elasticsearch PGP Key bằng lệnh sau:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Để cài đặt Elasticsearch trên Ubuntu ta có 2 cách là cài từ Repository hoặc cài từ file .deb

Cách 1: Cách Elasticsearch bằng APT Repository

Cài gói apt-transport-https

sudo apt-get install apt-transport-https

Lưu định nghĩa repository vào /etc/apt/sources.list.d/elastic-6.x.list:

(Repository mặc định ko có elasticsearch)

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Cài đặt Elasticsearch bằng lệnh:

sudo apt-get update && sudo apt-get install elasticsearch

Done!

Cách 2: cài đặt elasticsearch bằng gói .deb

Chạy các lệnh dưới đây để tải và cài đặt elasticsearch bằng file .deb

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.deb
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.deb.sha512
shasum -a 512 -c elasticsearch-6.4.0.deb.sha512 
sudo dpkg -i elasticsearch-6.4.0.deb

Done!

Chạy elasticsearch.

Elasticsearch sau khi được cài đặt sẽ không tự động chạy.

Để khởi động, start, stop elasticsearch ta làm như sau:

Lệnh để chạy server elasticsearch$ sudo systemctl start elasticsearch.service:

$ sudo systemctl start elasticsearch.service

Lệnh khởi tạo 1 index, mapping trong index đó và 1 document:

$ curl -X PUT http://localhost:9200/team/_mapping/member

Khởi tạo thành công , màn hình sẽ trả về dòng

{"acknowledged":true,"shards_acknowledged":true,"index":"team"}

Là khởi tạo thành công index “team”

Sử dụng câu lệnh để truy xuất dữ liệu trên ElasticSearch

  • Lệnh liệt kê các index có trong ES:
    $ curl -X GET "localhost:9200/_cat/indices?v"
    
  • Lệnh tạo document của index: ở đây là thêm member với các trường thuộc tính
    $ curl -X PUT http://localhost:9200/team/_mapping/member?{&"properties"= {&"id"= { "type": "text" },&"name"= { "type": "text" },&"email"= { "type": "text" },&"age"= { "type": "integer" },&"phone"= { "type": "text" },&"image"= { "type": "text" },&"technologies"= {"type" : "text" }&}&}
    
  • Lệnh kiểm tra tất cả index đã khởi tạo:
    $ curl -X GET http://localhost:9200/team?pretty
    
  • Lệnh thêm, sửa dữ liệu vào index trên(team), ở đây là dữ liệu do nhóm em fake ra và insert vào
    $ curl -X PUT http://localhost:9200/team/member/_bulk?{"create"= { "_id": 1, "_type": "member"}&{"id"= "5510ce4ee174054836ef3c5a","name": "Vargas Rosa","email": "[email protected]","age": 25,"phone": "+1 (807) 530–3567","image": "http://api.randomuser.me/portraits/men/78.jpg","description": "enim Lorem upidatat et nostrud ut irure qui qui nulla qui deserunt fugiat laborum elit","technologies": "ios javascript python"}&{"create"= { "_id": 2, "_type": "member"}&{"id"= "5510ce4e24ecdab88fe18d06","name": "Navarro Thornton","email": "[email protected]","age": 34,"phone": "+1 (896) 579–3364","image": "http://api.randomuser.me/portraits/men/59.jpg","description": "sit enim velit cillum magna commodo tempor","technologies": "swift erlang java"}&{"create"= { "_id": 3, "_type": "member"}&{"id"= "5510ce4e6e7bbdbc120c9a89","name": "Francine Aguirre","email": "[email protected]","age": 30,"phone": "+1 (963) 492–3402","image": "http://api.randomuser.me/portraits/men/82.jpg","description": "cu et sit ullamco tempor Lorem excepteur magna pariatur","technologies": "javascript ionic ruby"}&{"create"= { "_id": 4, "_type": "member"}&{"id"= "5510ce4ebd2a509edd8c6b50","name": "Krystal Simmons","email": "[email protected]","age": 40,"phone": "+1 (857) 418–2040","image": "http://api.randomuser.me/portraits/women/10.jpg","description": "ea dolor ex proident eiusmod et ut irure esse","technologies": "ruby c c"} 
    
  • Lệnh hiển thị thông tin các dữ liệu trong document và của từng doccument sau khi đã thêm
    $ curl -X GET http://localhost:9200/team/member/4?pretty
    
  • Lệnh tìm kiếm tất cả dữ liệu các document trong index sử dụng API Search
    $ curl -X GET http://localhost:9200/_search?pretty=true
    
  • Lệnh tìm kiếm theo text nhập ở tất cả các trường trong document , ở đây key search của mình là ruby, đây cũng chính là điểm mạnh của Elasticsearch, nó không giống với query like như thao tác với DB vì nó cần phải nhập đầy đủ text đó ví dụ như ruby ở trên sẽ trả về các document member có text là ruby trong tất cả các field
    $ curl -X GET http://localhost:9200/_search?q=ruby
    
  • Lệnh xóa 1 index
     $ curl -X DELETE "localhost:9200/cuongquach-company"

Tài liệu tham khảo Elasticsearch là gì?

Vẫn còn một số các hoạt động, các API để xử lý vào thao tác với Index trong Elasticsearch, nhưng với phần tìm hiểu ở trên về một công cụ mạnh mẽ như elasticsearch là đủ để có thể thao tác, sử dụng và làm quen với elasticsearch. Các bạn có thể tham khảo ở các trang dưới đây.

Viết Unit Test cho Vue component cho người mới bắt đầu

Cái nhìn về unit test cho component, test cái gì, cái gì không test khi viết unit test

Khi viết unit test, mình thấy không cần bỏ ra quá nhiều thời gian để cover 100% các case sẽ có, nhưng vẫn đảm bảo đủ các trường hợp cần thiết. Vậy câu hỏi là: như thế nào là đủ? Đây là những quan điểm rất cá nhân, nếu bạn nào đã là master of unit test rồi thì mình hy vọng có được sử chỉ giáo.

Mình xem như bạn đã biết chút ít về Jest và Vue Test Utils, đã chạy vue-cli để setup một dự án mới với Jest

Việc làm unit test lương cao trong tháng

Xác định những gì cần test

Test cái gì?

Khi chúng ta viết test cho một component, bắt đầu với những public interface của component đó. Đừng nghe đến chứ public interface mà rung sợ, nó chỉ là những gì component đó tương tác với thế giới bên ngoài. Nếu bạn viết hướng dẫn sử dụng để người khác xài component đó, bạn viết những gì, đó là những thứ bạn sẽ test, component nhận vào những gì và output ra những gì.

Đầu vào của component

  • props
  • tương tác của user, click, kéo-thả
  • store
  • route params Đầu ra của component
  • render ra DOM
  • tạo ra sự kiện nào đó
  • thay đổi route
  • cập nhập lại store

Khi tập trung vào những public interface này nghĩa là chúng ta cũng không tập trung vào logic bên trong của component, từng dòng code của component đó chạy ra sao. Nghe có vẻ không hợp lý, nhưng unit test chỉ tập trung vào kết quả trả về, không quan tâm làm thế nào để có kết quả đó.

Component <RandomNumberGenerator/> bên dưới, nó sinh ra trong cuộc đời này là để tạo một con số ngẫu nhiên nằm trong khoảng min và max. Trước khi tiếp tục, bạn có thể xác định được input và output của component này chưa?

// RandomNumberGenerator.vue
<template>
  <div>
    <span class="number">{{ randomNumber }}</span>
    <button v-on:click="generateRandomNumber">Generate Random Number</button>
  </div>
</template>
    
    
<script>
export default {
  props: {
    min: {
      type: Number,
      default: 1
    },
    max: {
      type: Number,
      default: 10
    }
  },
  data() {
    return {
      randomNumber: 0
    }
  },

  methods: {
    generateRandomNumber() {
      this.randomNumber =
        Math.floor(Math.random() * (this.max - this.min + 1)) + this.min
    }
  }
}
</script>

Cái gì KHÔNG CẦN test

Chúng ta không cần biết nó đã làm như thế nào, cách làm đó đúng hay sai chúng ta không phải là người đi kiểm tra, ví dụ như <RandomNumberGenerator/>, chúng ta đưa vào 2 input min và max, hàm sẽ thực hiện việc đó là

generateRandomNumber() {
  this.randomNumber = Math.floor(Math.random() * (this.max - this.min + 1) ) + this.min;
}

Tất cả những gì chúng ta cần đảm bảo là con số trả về nằm giữa 2 giá trị min và max, nếu sau này có cập nhập hay thay đổi cách hiện thực của hàm này, dùng thư viện khác để random, dùng cách khác để random, chúng ta không cần kiểm tra cách làm bên trong.

Ví dụ

Component TestComponent.vue bên dưới, nó có 3 dependency là Vuex ($store), Vue Router ($router) và Vue Auth ($auth)

// TestComponent.vue
<template>
  <div>
    <h2>{{ item.title }}</h2>
    <button @click="addToCart">Add To Cart</button>
    <img :src="item.image" alt=””/>
  </div>
</template>
<script>
export default {
  name: "ProductItem",
  props: [ "id" ],
  computed: {
    item () {
      return this.$store.state.find(
        item => item.id === this.id
      );
    }
  },
  methods: {
    addToCart () {
      if (this.$auth.check()) {
        this.$store.commit("ADD_TO_CART", this.id);
      } else {
        this.$router.push({ name: "login" });
      }
    }
  }
};
</script>

Phân tích

Component này được sinh ra, nuôi dạy, cho ăn học để lớn lên là để

  • Hiển thị một sản phẩm dựa trên prop id (toàn bộ sản phẩm nằm trong store)
  • Nếu là chưa đăng nhập, click vào nút Add to Card sẽ đẩy về trang Login
  • Nếu user đã đăng nhập, click vào Add to Card, nó sẽ bắn ra sự kiện ADD_TO_CARD để Vuex cập nhập

Input của component này

  • id
  • state từ Vuex và Vue Auth
  • User click nút Add to Card

Output của component này

  • Render html
  • Vue Router Push (cho user chưa đăng nhập)
  • Data được gửi tới Vuex mutation (nếu user đã đăng nhập)

Unit test

Chúng ta sử dụng một function, trả về một object dùng để config, cho tiết kiệm thời gian phải viết đi viết lại ấy

item.spec.js

import { shallowMount } from '@vue/test-utils'
import TestComponent from '@/components/TestComponent'

function createConfig (overrides) {
    const id = 1
    const mocks = {
        // Vue Auth
        $auth: {
          check: () => false
        },
        // Vue Router
        $router: {
          push: jest.fn()
        },
        // Vuex
        $store: {
          state: [ { id } ],
          commit: jest.fn()
        }
    }
    const propsData = { id }
    return Object.assign({ mocks, propsData }, overrides)
}

describe('TestComponent.vue', () => {
    
})

Test case 1: Render HTML

Có ai đó vô tình đổi tên biến title thành name và quên mất cập nhập trong file template. Có vẻ là một tình huống rất cần để viết test đúng không? Nhưng viết thế nào, số lượng biến như vậy trong template là nhiều vô số kể, viết test từng biến một thì chắc hết cả tuổi thanh xuân.

Cách tốt nhất để test trong trường hợp trên là dùng snapshot test. Nó sẽ không chỉ kiểm tra title mà còn gồm luôn cả image, button text, class,…

test('TEST CASE 1: Render HTML', () => {
    const wrapper  = shallowMount(Item, createConfig())
    expect(wrapper).toMatchSnapshot()
})

Viết unit test cho Vue Component

Chúng ta không kiểm tra đoạn text bên trong có render đúng như input không, như thế này là thừa thải

test('render correct', () => {
    const wrapper  = shallowMount(Item, createConfig())
    expect(wrapper.find('h2').text()).toBe(item.title)
})

Test case 2: router login được gọi khi click button mà chưa đăng nhập

test('TEST CASE 2: router login được gọi khi click button mà chưa đăng nhập', () => {
    const config = createConfig()
    const wrapper = shallowMount(Item, config)
    wrapper.find('button').trigger('click')
    /// thêm expect ở bên dưới
})

Mình sẽ không quan tâm, <Login.vue/> có được mount vào sau khi click hay không, chúng ta chỉ expect khi click $router sẽ push vào object { name: "login" }

const spy = jest.spyOn(config.mocks.$router, 'push')
expect(spy).toHaveBeenCalledWith({ name: 'login' })

Test case 3: vuex được gọi khi user đã đăng nhập và click button

Cũng tương tự như trên, chúng ta sẽ test mutation cập nhập đúng giá trị chúng ta mong muốn khi viết test cho store, còn ở component, chúng ta cần biết component có commit lên cho Vuex chưa

Sửa lại $auth.check thành true để giả lập đăng nhập thành công rồi, chúng ta kiểm tra phương thức commit của store

test('TEST CASE 3: vuex được gọi khi user đã đăng nhập và click button', () => {
    const config = createConfig({
        mocks: {
            $auth: {
              check: () => true
            },
            $store: {
              state: [{ id: 2 }],
              commit: jest.fn()
            }
        }
    })
    const wrapper = shallowMount(TestComponent, config)
    wrapper.find('button').trigger('click')
    const spy = jest.spyOn(config.mocks.$store, 'commit')
    expect(spy).toHaveBeenCalled()
})

 

Toàn bộ file spec lúc này

import { shallowMount } from '@vue/test-utils'
import TestComponent from '@/components/TestComponent.vue'

function createConfig (overrides) {
  const id = 1
  const mocks = {
    $auth: {
      check: () => false
    },
    $router: {
      push: jest.fn()
    },
    $store: {
      state: [{ id }],
      commit: jest.fn()
    }
  }
  const propsData = { id }
  return Object.assign({ mocks, propsData }, overrides)
}

describe('TestComponent', () => {
    test('TEST CASE 1: Render HTML', () => {
        const wrapper = shallowMount(TestComponent, createConfig())
        expect(wrapper).toMatchSnapshot()
    })
    test('TEST CASE 2: router login được gọi khi click button mà chưa đăng nhập', () => {
        const config = createConfig()
        const wrapper = shallowMount(TestComponent, config)
        wrapper.find('button').trigger('click')
        const spy = jest.spyOn(config.mocks.$router, 'push')
        expect(spy).toHaveBeenCalledWith({ name: 'login' })
    })

    test('TEST CASE 3: vuex được gọi khi user đã đăng nhập và click button', () => {
        const config = createConfig({
        mocks: {
          $auth: {
            check: () => true
          },
          $store: {
            state: [{ id: 2 }],
            commit: jest.fn()
          }
        }
        })
        const wrapper = shallowMount(TestComponent, config)
        wrapper.find('button').trigger('click')
        const spy = jest.spyOn(config.mocks.$store, 'commit')
        expect(spy).toHaveBeenCalled()
    })
})

Kết

Mindset khi chúng ta viết unit test component là: mọi unit test đều dư thừa, trừ khi bạn có lý do cho việc unit test đó

Các câu hỏi chúng ta đặt ra trước khi viết

  • Component sinh ra trên trái đất này để làm gì
  • Public interface của component là gì, input, output nó là gì
  • Đoạn test đó để kiểm tra code của mình, hay code của người ta?

TopDev via Vuilaptrinh

Sử dụng v-model trên component lồng nhau

v model trên component lồng nhau

Cách viết dùng v-model để tự đồng bộ giá trị khi lồng các component

Bạn có component nhận vào prop, muốn sử dụng v-model để nó tự cập nhập giá trị khi có thay đổi

// Address.vue
<template>
    <div>
        <input name="street" v-model="street">
        <input name="city" v-model="city">
        <input name="state" v-model="state">
        <input name="zip" v-model="zip">
    </div>
</template>
<script>
    export default {
        props: ['street', 'city', 'state', 'zip']
    }
</script>

Bạn truyền nó vào như thế này, với hy vọng mọi thứ chạy ngon lành

// Form.vue
<template>
    <form>
        <input name="name" v-model="name">
        <input name="email" v-model="email">
        <mailing-address
            :street="address.street"
            :city="address.city"
            :state="address.state"
            :zip="address.zip"
        />
    </form>
</template>
<script>
    import MailingAddress from './Address.vue';
    export default {
        components: { MailingAddress },
        data() {
            return {
                address: {
                    street: '',
                    city: '',
                    state: '',
                    zip: ''
                }
            }
        }
    }
</script>

Nhưng không 😭 nó sẽ thông báo trong console, “Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. “

Về nguyên tắc, chúng ta ko được thay đổi giá trị của prop, nếu không lúc re-render nó sẽ ko còn đúng nữa

Để nó chạy ngon lành, chúng ta không dùng prop. Khi sử dụng v-model nó làm cho chúng ta 2 việc, bind giá trị vào biến value, gắn handle cho sự kiện v-on:input. Túm lại chúng ta ko cần dùng prop làm gì cả, chỉ việc dùng lùng value bên trong component

// Address.vue
<template>
    <div>
        <input name="street" v-model="value.street">
        <input name="city" v-model="value.city">
        <input name="state" v-model="value.state">
        <input name="zip" v-model="value.zip">
    </div>
</template>
<script>
    export default {
        props: {
            value: {
                type: Object,
                required: true
            }
        },
        watch: {
            value() {
                this.$emit('input', this.value);
            }
        }
    }
</script>

Khi sử dụng

<mailing-address v-model="address" />

Nếu nó thêm một cấp nữa thì sao? Ví dụ bên trong Address.vue chúng ta nhét thêm một component cháu nội của Form nữa

// Address.vue
<template>
    <div>
        ...
        <state v-model="value.state" />
</div>
</template>
<script>
    import State from "./State";
    export default {
        components: { State },
        props: {
            value: {
                type: Object,
                required: true
            }
        },
        watch: {
            value() {
                this.$emit('input', this.value);
            }
        }
    }
</script>

State component

<template>
    <select v-model="value">
        <option v-for="(state, abbreviation) in states"
                :value="abbreviation"
                v-html="state"
        ></option>
    </select>
</template>
<script type="text/babel">
    export default {
        props: {
            value: {
                type: String,
                required: true
            }
        },
        data() {
            return {
                states: {
                    NY: 'New York',
                    WI: 'Wisconsin'
                    // + rest of the states
                }
            }
        }
    }
</script>

Nó sẽ tiếp tục chửi bới chúng ta, vì chúng ta đi thay đổi prop nữa rồi, chúng ta cần đưa nó về computed

// State.vue
<template>
    <select v-model="localState">
        <option v-for="(state, abbreviation) in states"
                :value="abbreviation"
                v-html="state"
        ></option>
    </select>
</template>
<script type="text/babel">
    export default {
        props: {
            value: {
                type: String,
                required: true
            }
        },
        data() {
            return {
                states: {
                    NY: 'New York',
                    WI: 'Wisconsin'
                    // + rest of the states
                }
            }
        },
        computed: {
            localState: {
                get() {return this.value},
                set(localState) { this.$emit('input', localState)}
            }
        }
    }
</script>

Cách này giống như chúng ta dùng controlled component trong React

TopDev via Vuilaptrinh

CEO TopDev ra mắt công nghệ AI/Computer Vision trợ giúp kết nối doanh nghiệp với người mất việc vì Covid

Công nghệ trợ giúp kết nối doanh nghiệp với người mất việc vì Covid

Covid-19 là nguyên nhân chính gây ra tình trạng sa thải hàng loạt do thu hẹp quy mô, giải thể, cắt giảm nhân sự của rất nhiều doanh nghiệp. Tại Mỹ, chỉ riêng 1 tháng kể từ lúc bùng phát dịch, đã có đến hơn 400 startup công khai cắt giảm đến hơn 50 nghìn việc làm. Con số này mới chỉ là bề nổi rất nhỏ và chỉ tính riêng các startup công nghệ tại Silicon Valley (Nguồn: https://layoffs.fyi)

Tại Việt Nam, theo một khảo sát gần đây nhất của TopDev một trong những đơn vị tuyển dụng IT uy tín nhất hiện nay, cho biết có đến 34% doanh nghiệp đang phải thu hẹp quy mô, cắt giảm chi phí và nhân sự để tồn tại trước nguy cơ kéo dài cho đến khi tìm ra vaccine.

Đã có rất nhiều giải pháp hỗ trợ người mất việc, phổ biến nhất là công khai danh sách các nhân sự bị mất việc để các doanh nghiệp khác có thể tiếp nhận tuyển dụng lại, tuy nhiên việc này dẫn đến lộ các thông tin cá nhân như số điện thoại hoặc email, đây là miếng mồi ngon cho các loại tội phạm mạng khác khai thác.

Bên cạnh đó, việc này cũng không giúp ích gì nhiều cho người mất việc lẫn doanh nghiệp vì không đủ thông về học vấn, kỹ năng, kinh nghiệm…điều mà ứng viên thường thể hiện trong CV tìm việc, khiến cho doanh nghiệp rất khó để chọn đúng người để tuyển dụng lại.

Với một cách tiếp cận rất khác, sử dụng AI để ẩn tự động các thông tin liên hệ trong CV, bảo mật thông tin cá nhân, trong khi vẫn không làm mất đi tính thẩm mỹ và các thông tin chi tiết khác lột tả chính xác về ứng viên, kết hợp với nền tảng kết nối tự động giúp doanh nghiệp đánh giá cũng như tìm đúng người họ cần.

Khi truy cập vào covid.topdev.vn, doanh nghiệp sẽ tiếp cận danh sách rất nhiều ứng viên đang tìm việc mới đi kèm với CV của từng người, chỉ vài thao tác gõ từ khóa tìm kiếm hoặc sử dụng bộ lọc sẽ cho ra kết quả những nhân sự phù hợp với nhu cầu.

Nền tảng công nghệ AI quét và che thông tin cá nhân trong file PDF được chính CEO Nguyễn Hữu Bình phát triển từ một hobby project (dự án nghiên cứu từ sở thích cá nhân) mà ông đã theo đuổi 3 năm, cho khả năng nhận dạng chính xác dù CV được tạo ra từ bất kỳ công cụ hoặc dịch vụ nào.

áp lực mất việc vì covid-19

Để hiểu hơn về đặc thù của nền tảng, “cha đẻ” của hệ thống Covid.topdev cho biết: Tôi đã sử dụng nhiều tiến bộ mới nhất của công nghệ nhận dạng để có thể hoạt động chính xác với muôn hình vạn trạng cách design CV của người tìm việc vì để đảm bảo được thiết kế gốc và xác định vị trí thông tin là điều hết sức phức tạp; việc sử dụng công nghệ mới giúp họ thể hiện tốt nhất những gì mình có, lại đảm bảo an toàn thông tin riêng tư trong quá trình tìm việc mới”.

CEO TopDev ra mắt công nghệ AI/Computer Vision trợ giúp kết nối doanh nghiệp với người mất việc vì Covid

Giải pháp ra đời với kim chỉ nam trợ giúp người mất việc tìm việc mới nhanh nhất có thể, ứng viên được đảm bảo những tiêu chuẩn về nội dung, hình thức, tính bảo mật thông tin cá nhân, mở ra khả năng tìm được việc mới nhanh gấp nhiều lần so với trước đây, hiện đây là một hệ thống công khai CV trong điều kiện bảo mật tân tiến nhất trong giới công nghệ tuyển dụng ở Việt Nam và thế giới

nền tảng CV bảo mật

Nếu như đã chuẩn bị sẵn CV cho mình, thì bạn không cần phải làm gì nhiều nữa – chỉ cần đăng tải trực tiếp hoặc URL bộ Resume/ CV của mình tại Hệ thống

Ngay sau khi đăng tải, hệ thống tích hợp công nghệ AI – Computer vision sẽ tiến hành đọc quét dữ liệu của hồ sơ và ẩn đi các thông tin cá nhân của bạn – tất cả các thông tin cá nhân nhạy cảm bao gồm hình chụp thẻ, thông tin email, số điện thoại, các đường link mạng xã hội,… sẽ được ẩn đi ngay khi upload CV. Kể từ đó, bạn có thể rải chiếc CV của mình ở khắp nơi như các group trên Facebook, Linkedin hay các forum tập trung nhiều nhà tuyển dụng mà không bị lộ thông tin cá nhân, trong khi nhà tuyển dụng vẫn có thể liên hệ khi cần và sau khi được sự đồng ý của bạn.

bảo mật thông tin ứng viên

Đây là phần điểm sáng và tiến tiến nhất của nền tảng Covid.topdev. Hệ thống Covid.topdev giúp đảm bảo với người tìm việc:

  • Cam kết bảo mật thông tin: Qua Covid.topdev, hệ thống sẽ bảo vệ bạn bằng cách che các thông tin nhạy cảm (gương mặt, thông tin email – số điện thoại…), chỉ cho phép nhà tuyển dụng download bản gốc khi có sự đồng ý của bạn. 

Hiện nay trên thị trường không thiếu các hệ thống cho đăng tải CV đơn giản, và các nhà tuyển dụng sau khi có thông tin các CV tiềm năng sẽ liên hệ ngay đến ứng viên. Tuy nhiên mô hình cũ này làm cho người tìm việc ở thế “bị động” – họ dễ rơi vào tình trạng spam offer từ nhiều nhà tuyển dụng mà chưa có thông tin trước.

Một khi hồ sơ của bạn được cho là tiềm năng, nhà tuyển dụng sẽ tiến hành gửi JD (Job description) về email của bạn thông qua hệ thống của nền tảng. Bạn sẽ có thể preview JD và lựa chọn các bên mà mình cảm thấy phù hợp và tiếp tục các khâu tiếp theo: Liên hệ với nhà tuyển dụng bằng CV đầy đủ và phỏng vấn.

  • Giữ nguyên format của CV: Sẽ không ít các bạn lo lắng về việc khi hệ thống xử lý và quét các thông tin trên CV và ảnh hưởng đến format bạn đã thiết kế và apply cho CV của mình. Hệ thống Covid.topdev cải tiến đảm bảo giữ nguyên format và trạng thái CV của bạn sau khi đã upload lên hệ thống, dù bạn đã thiết kế CV bằng các loại công cụ hay dịch vụ khác nhau

Chỉ các thông tin cá nhân liên quan được phát hiện sẽ được che đi và tất cả các thông tin còn lại sẽ “yên vị”, đảm bảo công sức làm đẹp đơn ứng tuyển và gây ấn tượng với các nhà tuyển dụng. 

  • Spread CV hiệu quả hơn: Đơn cử phía TopDev cũng là một đơn vị chuyên trang tin Tuyển dụng hot nhất hiện nay tại Việt Nam. Với số lượng khách hàng doanh nghiệp “khủng” nhất nhì tại thị trường, hệ thống hoàn toàn có thể giúp mang hồ sơ của bạn (sau khi đã được xử lý thông tin) nhanh chóng tiếp cận các nhà tuyển dụng hơn trong vị trí mong muốn của mình.

Trường hợp bạn chưa có CV trong tay, thì cũng không phải lo lắng. Hệ thống TopDev đã đồng thời tích hợp với bộ công cụ tạo CV online cho phép bạn chỉ cần input các thông tin và chọn các template CV mới nhất có sẵn của hệ thống được update thường xuyên. Ngay sau khi hoàn thiện CV, bạn sẽ có thể thao tác đăng tải lên nền tảng Covid.topdev và đợi thông tin từ phía nhà tuyển dụng.

ứng viên phù hợp cho doanh nghiệp

Các nhà tuyển dụng từ các tổ chức/doanh nghiệp khi tìm kiếm ứng viên, họ muốn có một danh sách được sắp xếp theo trình tự logic, rõ ràng và có thao tác dễ dàng sử dụng.

Trong đó, mỗi thông tin về ứng viên cần được cập nhập đầy đủ, chính xác về trình độ chuyên môn, kinh nghiệm để họ có thể khoanh vùng, chọn lọc và liên hệ ứng viên phù hợp nếu đáp ứng đủ những tiêu chí mà vị trí nhân sự họ đang tuyển dụng. Và tất nhiên, giải pháp tạo CV của TopDev hoàn toàn thực hiện tốt vai trò này.

covid-topdev

Sau khi truy cập vào https://covid.topdev.vn/

Bước 1: Chọn vào ô Search (Box 1) và gõ vị trí/ skill cần tìm 

Bước 2: Chọn mục Filter (Box 2) và chọn điều kiện lọc kèm (Vd: Location, Date ứng tuyển,…) 

Bước 3: Gõ điều kiện vị trí tương ứng cần tìm

Sau khi nhận yêu cầu, hệ thống sẽ cho hiển thị list các CV ứng viên tương ứng với yêu cầu của nhà tuyển dụng. Nhân sự có thể nhấn preview xem CV của các bạn mà không có thông tin liên hệ trước. Nếu như cảm thấy CV đạt yêu cầu, nhân sự sẽ Mời ứng tuyển CV đó bằng cách gửi JD vị trí về email của bạn qua hệ thống. 

covid-topdev

Các resume – CV trên nền tảng của TopDev chắc chắn sẽ không làm nhân sự thất vọng vì sự chỉn chu, chuyên nghiệp và được hợp thức hoá theo mô hình đa dạng tùy ngành nghề, tránh lối mòn chỉ đơn thuần trình bày như một đơn khai báo thông tin theo các form chưa có sự thống nhất về quy cách. 

kết nối doanh nghiệp và ứng viên

Chính bằng tính năng tuyệt vời của mình cũng góp phần tạo ra nhiều cơ hội hơn để hồ sơ các ứng viên có thể tiếp cận đến với nhiều nhà tuyển dụng. Đây cũng là điểm đặc biệt tạo nên lợi thế của giải pháp từ TopDev; vừa giúp người giúp việc tiếp cận nhà tuyển dụng nhanh chóng hơn, mà chính các nhà tuyển dụng cũng có được một nền tảng mới dễ dàng tìm kiếm ứng viên chuyên nghiệp và tiềm năng.

Đây là một dự án được xem là một bước đi khá liều lĩnh. Qua đó ông Nguyễn Hữu Bình cũng chia sẻ: “Vì hỗ trợ hoàn toàn miễn phí nên tiềm ẩn rủi ro ảnh hưởng đến doanh thu của công ty, nhưng trước tình hình 34% doanh nghiệp đang phải cắt giảm chi phí, quy mô hoạt động và sa thải nhân sự, với mong muốn hỗ trợ xã hội và cộng đồng, tôi nhận được sự ủng hộ của hội đồng quản trị cũng như sự động viên của đội ngũ dưới quyền khi triển khai dự án này.” 

CEO TopDev ra mắt công nghệ AI/Computer Vision trợ giúp kết nối doanh nghiệp với người mất việc vì Covid - 2

Giải pháp bảo mật CV từ đội ngũ TopDev nói chung và sáng kiến từ ông Nguyễn Hữu Bình, CEO của TopDev cùng các cộng sự của mình nói riêng nhằm hướng đến việc cung cấp cho các ứng viên đang thất nghiệp có cơ hội trải nghiệm và truyền tải CV online của mình trên một nền tảng công nghệ được đảm bảo về tính an toàn, xác thực. TopDev hy vọng giải pháp ra đời sẽ tạo ra một sự cộng hưởng lớn, mang lại những giá trị thiết thực nhất cho người dùng.

Tạo một animation cho component trong React

Sử dụng React, styled-components, react-flip-toolkit để tạo animation giống như mên trên trang chủ của Stripe

Phân tích

Trước tiên phân tích cái animation này ra thành nhiều phần để dể hình dung. Có thể xem dạng slow motion trên Codepen để xem nhé.

  • container dropdown màu trắng sẽ thay đổi kích thước và vị trí
  • background màu xám ở phía dưới của dropdown transition độ cao
  • Khi di chuyển chuột khỏi dropdown, fade out nội dung trước đó đi và chuyển vị trí nó sang element mới, sau đó đưa nội dung mới lên.

Tìm việc React lương cao trong tháng up to 25M

Một vài lưu ý khi làm animation với React, cứ để browser quản lý layout. Thay vì sử dụng các dropdown khác nhau, chúng ta dùng 1 dropdown và thay đổi vị trí của nó, dùng Flip technique để giả lập như có 3 dropdown khác nhau.

Dựng component thô chưa có animate

Để bắt đầu ta dựng một component navbar sử dụng styled-component

Ở đây thì chưa thêm phần gray background ở dưới dropdown, cái này nó sẽ nằm absolute

Animate với Flip technique

Chúng ta sẽ sử dụng react-flip-toolkit để thay đổi kích thước và vị trí dropdown.

<Flipper flipKey={currentIndex}>
  <Navbar>
    {navbar.Config.map((n, index) => {
      // render navbar items
    })}
  </Navbar>
</Flipper>

Ở DropdownContainer component, đưa các element sẽ animate vào bên trong Flipped component, nhớ giá trị flipId phải khác nhau

<DropdownRoot>
  <Flipped flipId='dropdown-caret'>
    <Caret />
  </Flipped>
  <Flipped flipId='dropdown'>
    <DropdownBackground>
      {children}
    </DropdownBackground>
  </Flipped>
</DropdownRoot>

Làm 2 cái animate trên <Caret/> và <DropdownBackground/> riêng biệt, để thuộc tính overflow: hidden set trên <DropdownBackground /> không ảnh hưởng tới <Caret/>

Giờ có 1 vấn đề nhỏ là nội dung bên trong dropdown lúc xuất hiện bị stretch một cách kỳ cục, lý do là thuộc tính transforms: scale nó áp luôn trên children. Xử lý cái này bằng cách đưa nội dung này vào trong <Flipped/> kèm giá trị cho props inverseFlipId, lúc này children sẽ không bị effect từ thằng cha nữa, đồng thời xác định luôn là ko muốn áp thằng scale

<DropdownRoot>
  <Flipped flipId="dropdown-caret">
    <Caret />
  </Flipped>
  <Flipped flipId="dropdown">
    <DropdownBackground>
      <Flipped inverseFlipId="dropdown" scale>
        {children}
      </Flipped>
    </DropdownBackground>
  </Flipped>
</DropdownRoot>

Chăm chút

Cũng gần được rồi, chúng ta cần để ý thêm vào những chi tiết nhỏ nhất để animate nhìn cool hơn

Styled-components hỗ trợ rất tốt việc thay đổi keyframe animation. Chúng ta sẽ sử dụng tính năng này để làm animation lúc enter và cross-fade nội dung dropdown khi thay đổi ví trí chuột.

const getFadeContainerKeyFrame = ({ animatingOut, direction }) => {
  if (!direction) return;
  return keyframes`
    from {
      transform: translateX(${
        animatingOut ? 0 : direction === 'left' ? 20 : -20
      }px);
    }
    to {
      transform: translateX(${
        !animatingOut ? 0 : direction === 'left' ? -20 : 20
      }px);
      opacity: ${animatingOut ? 0 : 1};
    }
  `;
};

const FadeContainer = styled.div`
  animation-name: ${getFadeContainerKeyFrame};
  animation-duration: ${props => props.duration * 0.5}ms;
  animation-fill-mode: forwards;
  position: ${props => (props.animatingOut ? "absolute" : "relative")};
  opacity: ${props => (props.direction && !props.animatingOut ? 0 : 1)};
  animation-timing-function: linear;
  top: 0;
  left: 0;
`

Khi user đưa chuột lên menu mới, chúng ta ko chỉ đưa vào dropdown hiện tại mà con dropdown trước đó như children cho DropdownContainer, cùng với những thông tin về hướng di chuột của user. Sau đó DropdonwContainer sẽ wrap hết tất cả children của nó trong một component mới, FadeContents, thằng này sẽ sử dụng keyframe animation code ở trên để thêm animation tương ứng

Background animation

Cuối cùng chúng ta thêm gray background

const updateAltBackground = ({
  altBackground,
  prevDropdown,
  currentDropdown
}) => {
  const prevHeight = getFirstDropdownSectionHeight(prevDropdown)
  const currentHeight = getFirstDropdownSectionHeight(currentDropdown)
  
  // we'll use this function when we want a change 
  // to happen immediately, without CSS transitions
  const immediateSetTranslateY = (el, translateY) => {
    el.style.transform = `translateY(${translateY}px)`
    el.style.transition = "transform 0s"
    requestAnimationFrame(() => (el.style.transitionDuration = ""))
  }

  if (prevHeight) {
    // transition the grey ("alt") background from its previous height
    // to its current height
    immediateSetTranslateY(altBackground, prevHeight)
    requestAnimationFrame(() => {
      altBackground.style.transform = `translateY(${currentHeight}px)`
    })
  } else {
    // immediately set the background to the appropriate height
    // since we don't have a stored value
    immediateSetTranslateY(altBackground, currentHeight)
  }
}

Source: https://github.com/aholachek/react-stripe-menu

TopDev via Vuilaptrinh

Xem thêm các vị trí tuyển nhân viên it tại đây

Sử dụng CSS content như thế nào cho đúng

Thuộc tính content trong CSS thường được sử dụng cùng với 2 ghost element là after và before, những giá trị nào có thể đưa vào cho thuộc tính content này

<div 
  data-done="&#x2705;"
  class="email">
    chriscoyier@gmail.com
</div>
.email::before {
  /* Chèn trước thẻ div giá trị của data-done + Email: */
  content: attr(data-done) " Email: "; 
}

Sử dụng CSS content như thế nào cho đúng

Không phải giá trị nào đưa vào content này cũng hợp lệ

/* Được */
::after {
  content: "1";
}
/* Không được */
::after {
  content: 1;
}

Không thể tính toán gì đâu, nó chỉ là string thôi

<div data-price="4" data-sale-modifier="0.9">Coffee</div>
/* Méo chạy */
div::after {
  content: " $" 
    calc(attr(data-price) * attr(data-sale-modifier));
}
/* Nope */
::after {
  content: calc(2 + 2);
}

Muốn nối chuỗi ư?

/* Không chạy đâu, không phải javascript hay php */
::after {
  content: "1" . "2" . "3";
  content: "1" + "2" + "3";

  /* Dùng bình thường thế này thôi */
  content: "1" "2" "3";
  content: "1 2 3";
}

Đường dẫn hình thì được, mà không cho thay đổi kích thước hình ¯_(ツ)_/

p:before {
  content: url(image.jpg);
}

TopDev via Vuilaptrinh

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

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

Phát triển nhân viên có ý nghĩa quan trọng vì nó là sự cam kết về việc tạo môi trường hỗ trợ nhân viên cho họ nhìn thấy được những tiến bộ chuyên nghiệp của mình trong từng giai đoạn. Đồng thời, phát triển nhân viên là một sáng kiến ​​dài hạn và có những ảnh hưởng sâu sắc đến hiệu suất công việc, niềm tin với tổ chức và cả sự đồng hành. Cùng TopDev theo dõi bốn cách sau đây và bạn có thể bắt đầu cải thiện sự phát triển nhân viên tại công ty của mình.

1. Có chiến lược đào tạo rõ ràng & chuyên nghiệp

Để có thể dẫn dắt các nhân viên của bạn đạt đến sự thành công thì việc đầu tiên chính là cung cấp cho họ tất cả các công cụ và tài nguyên họ cần, nhằm thực hiện tốt công việc của mình. Điều này bao gồm đào tạo chuyên nghiệp.

Hãy xây dựng một nền tảng kiến thức với các thông tin quan trọng được minh chứng bởi số liệu thực tế để nhân viên có thể nắm được kiến thức nền (background knowledge) một cách tốt nhất.

Ngoài ra, khi sự phát triển công nghệ đang thay đổi nhiều lĩnh vực trong cuộc sống, nhân viên của bạn cần tiếp cận nhiều kiến thức hơn thay vì những nguồn thông tin vẫn chưa được cập nhật và đổi mới toàn diện. Cũng chính từ đó mà các công ty đã áp dụng nhiều mô hình giải pháp đào tạo khác nhau cho nhân viên của mình. 

Ví dụ như giải pháp học trực tuyến về các nguồn dữ liệu khoa học thông tin như Udemy , LinkedIn Learning CodeAcademy,.. Đây là những nguồn đáng tin cậy không những cung cấp cho nhân viên các kiến thức với sự linh động về thời gian mà còn tạo ra cơ hội cho nhân viên tự khai thác và vận dụng kiến thức vào quy trình thực hiện công việc của mình. Nếu chỉ xét riêng về khía cạnh trong ngành Nhân sự, thì trong một nghiên cứu trong bài Báo cáo về thế hệ Nhân sự tiếp theo của 15Five, có đến 75% các nhân viên tiềm năng đã bày tỏ nguyện vọng của mình về việc được đào tạo thêm các kỹ năng về quản lý và lãnh đạo. Điều này cho thấy mong muốn được học hỏi ở họ là rất lớn.

2. Phát triển người quản lý thành cố vấn chuyên môn cho các nhân viên

Là một người lãnh đạo, dường như việc bạn kiểm soát sự nỗ lực, ghi nhận sự thay đổi và phát triển của nhân viên mình là vô cùng khó khăn. Và người quản lý chính là người sẽ giúp bạn theo dõi, đánh giá đúng tình hình về mức độ phát triển của từng nhân viên trên lộ trình thăng tiến riêng của từng người. Vì thế, để cải thiện sự phát triển của nhân viên, điều đầu tiên bạn nên làm là phát triển kỹ năng của người quản lý thành một huấn luyện viên thật sự hiệu quả để họ có thể thúc đẩy kinh nghiệm và tạo động lực cho các nhân viên của mình. 

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

Công việc của một cố vấn chuyên môn chính là đồng hành và báo cáo về những cố gắng của nhân viên; điểm mạnh nào cần phát huy – điểm yếu nào cần khắc phục. Ngoài ra, người quản lý cần nắm được những mong muốn của nhân viên như: điều gì làm họ thích thú với công việc, điều gì làm họ kiệt sức,… để kịp đưa ra những giải pháp điều chỉnh và phát triển cho phù hợp. Và để dễ dàng nắm bắt và huấn luyện các nhân viên, người quản lý hãy bắt đầu bằng cách hỏi một số câu hỏi đơn giản như sau:

– Có bất kỳ trở ngại nào bạn đang gặp phải, và tôi có thể giúp gì không?

– Thời điểm trong ngày của bạn mà bạn thấy tràn đầy năng lượng nhất?

– Bạn muốn học thêm điều gì có thể giúp bạn thực hiện tốt vai trò của mình?

Hãy cho phép người quản lý tự định hướng những cuộc trao đổi để nhân viên có thể tự bày tỏ suy nghĩ về các thành tích. Từ đó, các nhà quản lý có thể hỗ trợ họ phát huy tối đa tiềm năng của mình để gặt hái được những mục tiêu xa hơn.

3. Nhấn mạnh các kỹ năng mềm

Những kỹ năng mềm thường bị lãng quên trong mô hình tự động hóa hoạt động của các công ty như hiện nay. Thế nhưng, ít ai biết được rằng kỹ năng mềm thật sự là một phần không thể thiếu trong công tác lập kế hoạch phát triển năng lực cho các nhân viên.

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

“Các kỹ năng của tương lai không phải đơn thuần là kỹ thuật, mà chúng là hành vi. Những kỹ năng mềm gọi là “mềm” nhưng bản chất thật sự chúng không “mềm” – ngược lại, chúng rất phức tạp, là những thứ mất nhiều năm để con người có thể học hỏi, thay đổi, thích ứng với phạm vị hoạt động của chúng. Chúng tôi gọi chúng là kỹ năng của sức mạnh. Và nhớ rằng trong xu thế cạnh tranh hiện nay, hãy nắm bắt một số kỹ năng mà nhiều CEO yêu cầu: sáng tạo – tư duy đổi mới, linh hoạt – nhanh nhẹn và khả năng thích ứng với mọi môi trường.”

Chia sẻ của Josh Bersin, một tác giả nổi tiếng với những tác phẩm chuyên nói về các vấn đề xoay quanh việc phát triển con người, khả năng lãnh đạo và công nghệ nhân sự. 

Các tổ chức/doanh nghiệp suy cho cùng cũng chỉ là một tập hợp gồm những con người làm việc cùng nhau dựa trên một sự thống nhất về mục tiêu, phương thức hoạt động, cách tổ chức và vận hành,… Tuy nhiên, họ quên mất sợi dây liên kết những con người lại và tạo ra hiệu suất công việc lại là những kỹ năng mềm. Các kỹ năng là chìa khóa quan trọng giúp thắt chặt các mối quan hệ đồng thời tăng cường khả năng kiểm soát và mức độ hoạt động của các công việc.

4. Đầu tư vào phát triển cá nhân

Nhân viên của bạn khó có thể phát triển được bản thân nếu cứ tập trung quá nhiều vào việc cống hiến cho tổ chức. Họ cũng chỉ là con người với bao gồm toàn bộ các trải nghiệm về thể chất, trí tuệ và cảm xúc. Vì thế để cải thiện và phát triển năng lực của họ, bạn cần tạo không gian để họ đầu tư vào việc phát triển cá nhân trước khi hướng đến mục tiêu phát triển toàn diện và chuyên nghiệp.

  Bí mật giúp tạo động lực và tăng năng suất cho nhân viên!

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

Cân bằng cảm xúc

Điều này không quá khó khăn. Bạn có thể đặt các câu hỏi như:

  • Bạn cảm thấy thế nào về công việc của mình gần đây? 
  • Bạn đang vật lộn với bất cứ điều gì? 

Việc liên tiếp đặt ra các câu hỏi nhằm đáp ứng các nhu cầu cơ bản về ghi nhận, lắng nghe và phản hồi, tạo ra sự tương tác giữa nhân viên với nhà quản lý/người lãnh đạo. Một người quản lý biết cách khai thác và hỗ trợ, người có kỹ năng lắng nghe, đồng cảm và luôn hiện diện trước những thách thức của nhân viên sẽ là điểm tựa vững chắc giúp nhân viên tìm thấy sự cân bằng khi họ chìm trong một không gian cảm xúc khó khăn.

Đầu tư phát triển về mindset

Sách và các buổi hội thảo, những khóa học không nhất thiết phải là về lĩnh vực chuyên môn mà nó có thể là những nguồn bổ trợ về các kỹ năng khác, kiến thức liên ngành. Sức mạnh của việc cung cấp giáo dục không chỉ giúp nhân viên hoàn thiện lành mạnh.

Bên cạnh đó, khi nhân viên của bạn đạt được thành tích xuất sắc, người quản lý/nhà lãnh đạo có thể tạo cơ hội tiếp cận hoặc tài trợ cho các nhân viên tham gia các khóa học, những hoạt động ngoại khóa, giao lưu phù hợp với mục tiêu và sở thích cá nhân của họ.

Khi nhân viên được cung cấp các công cụ để làm tốt công việc của họ, được đào tạo để thăng tiến trong sự nghiệp, họ sẽ cảm thấy được hỗ trợ và hạnh phúc hơn. Việc quan tâm đến sự cải thiện và phát triển của nhân viên sẽ  giúp họ đồng hành lâu dài với tổ chức đồng thời tạo động lực để họ hoàn thành tốt nhiệm vụ và đóng góp vào sự phát triển chung của công ty. 

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

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

Test Automation — Con đường không dễ dàng với bất kỳ ai

test-automation-con-duong-khong-de-dang-voi-bat-ky-ai

Tác giả: Uyen Tran

Trong những người tôi từng trò chuyện, có hai người bạn sở hữu những điểm chung rất tình cờ. Đó là Max và Ellie — cùng từ Mỹ trở về Việt Nam làm việc tại startup, cùng trở thành Test Automation Engineer dù đây không phải lựa chọn ban đầu.

Từ lâu, các vị trí Tester thuộc team Quality Assurance (QA) vốn không phải lựa chọn được ưu tiên của nhiều người so với vị trí Developer/Software Engineer. Vậy con đường “tình cờ” trở thành Test Automation Engineer của Max và Ellie đã diễn ra như thế nào? Quá trình training, công việc của họ là gì và những cơ hội phát triển cho vị trí này ra sao?

Hãy cùng nhóm báo lá cải của Got It “hỏi xoáy đáp xoay” hai nhân vật đặc biệt hôm nay để tìm hiểu ngọn ngành câu chuyện này nhé!

Max (ngoài cùng bên trái) và Ellie (thứ tư từ bên trái) cùng team QA ở Got It Vietnam ❤

Uyên Trần: Các bạn từng có khởi đầu thế nào trước khi trở thành Test Automation Engineer tại Got It?

Max: Trước đây, mình từng làm Software Engineer cho một công ty nghiên cứu y học tại Mỹ, song cũng có một số cơ hội được trải nghiệm làm Test Automation. Tuy vậy, mình nhận thấy đây là một lĩnh vực phát triển ổn định, nên muốn lựa chọn một startup làm sản phẩm để học hỏi nhiều hơn. Ban đầu, mình tìm thấy Got It và chỉ có ý định apply làm Software Engineer như trước đây, không ngờ lại được offer chuyển sang một title mới toanh: Test Automation Engineer. Vì muốn thử sức xem mình có thể “lên skill” đến đâu trong ngành Test Automation, mình đồng ý ngay với lời đề nghị này.

Max (trái) và Ellie (phải) thời còn là du học sinh ở Mỹ

Ellie: Khác Max, mình vốn theo học ngành kiểm toán ở Mỹ từ đầu. Đến năm ba, mình mới quyết định đăng ký thêm ngành Computer Information System trong trường vì nhận thấy IT là ngành phát triển mạnh mẽ. Ngày tốt nghiệp, cầm trên tay một tấm bằng với hai chuyên ngành, dù chẳng phải dân chính gốc nhưng mình vẫn liều mạng apply làm engineer ở Got It. Cuối cùng, mình được Got It gợi ý trở thành Test Automation Engineer để phù hợp với background học tập hiện tại. Lúc đấy mình chỉ nghĩ rằng: “Tội gì mà không thử nhỉ?”

Ellie trong ngày tốt nghiệp

Uyên Trần: Không ai trong số hai bạn có kinh nghiệm làm tester từ đầu, vậy Max và Ellie có gặp khó khăn gì trong quá trình training không?

Max: Vì đã có sẵn một chút nền tảng về Test Automation, mình không mất quá nhiều thời gian để học về kỹ thuật. Tuy vậy, trong nửa khoảng thời gian đầu training, mình cần nghiên cứu kỹ lưỡng về sản phẩm và quy trình của team Quality Assurance (QA). Về mặt sản phẩm, tester cần hiểu rõ flow trọng yếu của sản phẩm (hay business impact flow) ở cấp độ của cả người dùng lẫn người kiểm thử. Về quy trình, mình cần nắm chắc các công cụ chuyên biệt team sử dụng như Trello, Jira, Testrail và học thêm cả về SQL nữa! Sản phẩm và quy trình ở Got It khá phức tạp nên mình luôn phải tìm hiểu thật cẩn thận. Tester mà bỏ sót hay hiểu lầm chỗ nào thì nguy lắm!

Ellie: Trong khoảng 7 tuần training, mình cần chú trọng hơn cả về mặt kỹ thuật vì vốn không học sẵn chuyên ngành như Max. Khoảng 3 tuần cuối, mình tìm hiểu các concepts, framework về Test Automation. Phần lớn thời gian, mình học các khóa online về Python và Selenium (ngôn ngữ lập trình và framework Got It sử dụng trong Test Automation) dưới sự hướng dẫn của mentor Quý Lê (người từng được lên sóng trên blog đó).

Chỉ nhớ hồi đó các vấn đề mentor giao cho mình giải quyết cực “khoai”, nhất là việc viết test script cho một số tính năng và các bài tập liên quan đến OOP (Object-oriented programming) — một model mọi engineers ở Got It phải thuộc “nằm lòng”. Cũng may là có daily standup, mình được mentor đưa feedback và giải đáp câu hỏi thường xuyên nên cuối cùng cũng vượt “cửa ải” training thành công *cười*.

Uyên Trần: Bạn có thể mô tả cụ thể những công việc một Test Automation Engineer sẽ làm ở Got It không?

Ellie: Công việc của chúng mình có thể được mô tả với quy trình như sau. Khi đã hiểu rõ các requirements từ Product Manager, Test Automation Engineer sẽ bắt đầu viết các test cases. Chúng mình cần nghiên cứu kỹ tài liệu của developers về cách họ triển khai các tính năng, từ đó lên phương án thiết kế việc tự động hóa kiểm thử cho phù hợp. Sau đó, tester sẽ chuẩn bị các tài liệu, sắp xếp meeting để các thành viên cùng review việc triển khai (implement) test và ước tính thời gian hoàn thành.

Test Automation Engineer có một quy trình làm việc bài bản riêng không khác gì các Developers

Tiếp đến là phần việc đòi hỏi kỹ thuật phức tạp nhất: Viết code và xây dựng môi trường cho Test Automation. Giờ thì mọi thứ đã sẵn sàng, chạy test và phát hiện ra các bugs thôi! Cuối cùng, không thể quên việc kiểm thử hồi quy và flow trọng yếu của sản phẩm (Run regression and business impact flow).

Uyên Trần: Từ developer trở thành tester, Max có thấy công việc của mình phần nào nhàn hơn như suy nghĩ của nhiều người không?

Max: Là người đã trải nghiệm ở cả hai vị trí, mình thấy không thể đem hai công việc này lên bàn cân so sánh với nhau. Mình nhận thấy rằng một Test Automation Engineer vẫn phải biết xử lý các vấn đề kỹ thuật phức tạp. Ở Got It, team phải biết phân tích và quyết định hình thức kiểm thử (thủ công hay tự động) từ giai đoạn đầu, nếu chọn tự động sẽ dùng Python để triển khai (implement) test. Cùng với đó, tester cũng phải nắm chắc từng tính năng sản phẩm và cách thức hoạt động của hệ thống Back-end, Front-end để tìm ra các bugs mắt thường không thể tìm thấy.

Bên cạnh vấn đề kỹ thuật, team QA còn cần giao tiếp tốt với các thành viên khác trong team. Một bên là Product Manager (PM) để làm rõ các requirements và ticket; một bên là Software Engineers để đảm bảo các features tạo ra vừa đúng yêu cầu, vừa giúp giảm mức độ phức tạp của việc test.

Kỷ niệm “sấp” nhất với mình có lẽ chính là công việc đầu tiên sau khi hoàn thành training. Lúc này, team cần hoàn thành hệ thống Onboarding Experts cho sản phẩm ExcelChat và PowerpointChat — một bước quan trọng giúp thu hút và tuyển dụng các experts. Cùng với PM và team dev, team QA cũng làm việc cấp tốc chỉ trong vòng 2 tuần. Khi ấy, mình đã cảm nhận rõ hơn bao giờ hết tính chất của một startup — một guồng quay khác biệt hoàn toàn so với những gì mình làm trước đây.

Uyên Trần: Sau gần một năm làm trong team QA, với các bạn, đâu là đặc điểm nổi bật nhất một Test Automation Engineer cần có?

Ellie: Ngay từ những ngày onboarding đầu tiên, mình đã được mentors nhắc lại nhiều lần về đặc điểm khiến cho mọi QA Engineers ở Got It hoàn thành tốt công việc: “Be proactive to ask questions” (Hãy chủ động đặt câu hỏi), và mình vẫn thấy điều đó đúng cho đến bây giờ. Một tester phải luôn biết chủ động đặt câu hỏi, về những gì mình chưa hiểu, về cách vận hành của thế giới xung quanh. Từ đó, bản thân sẽ trở nên nhạy bén hơn với các vấn đề, nhanh chóng phát hiện ra các bugs đang tồn tại.

Trích dẫn một slide trong quá trình training mọi QA Engineer ở Got It đều không thể quên!

Nhưng không phải cứ đặt câu hỏi bừa, mà phải biết đặt những câu hỏi cần thiết và đúng lúc. Để làm được điều đó, bản thân mình đã luyện tập và cải thiện khả năng research. Trước khi đặt câu hỏi, mình tự nghiên cứu trước vấn đề bằng những resources hiện có, hình dung tổng quan vấn đề và chỉ tìm đến sự giúp đỡ với những khía cạnh thực sự phức tạp.

Max: Ngoài ra, mình thấy khả năng ước tính (estimation) và quản lý công việc cũng rất cần thiết với một tester. Từ giai đoạn đầu, tester đã cần ước tính các deadline quan trọng cho việc test, từ đó mới có thể tổ chức, thiết kế và viết test cases một cách hợp lý nhất. Thực chất thì khả năng ước tính cũng được rèn luyện trong chính cách mỗi người quản lý công việc cá nhân hàng ngày rồi. Làm ở startup, mình học cách tự set các deadlines cho bản thân, phân chia khối lượng công việc phù hợp và bám chắc theo các kế hoạch để hoàn thành. Nếu không, bản thân sẽ dễ trở nên quá tải và bỏ lỡ việc cần làm.

Uyên Trần: Cùng là du học sinh trở về Việt Nam, lại làm trong ngành kiểm thử vốn tồn tại một số định kiến, các bạn nghĩ sao về cơ hội phát triển cho mình?

Ellie: Thực tế, sau khi làm Test Automation Engineer một thời gian, mình nhận ra đây là vị trí giúp một người có thể phát triển theo cả mảng technical (kỹ thuật) lẫn management (quản lý). Với những kỹ năng và kiến thức có được, mình có thể lựa chọn trở thành kỹ sư phần mềm, nhưng cũng có thể tiếp tục làm Test Lead hay thậm chí chuyển hướng trở thành Product Manager/Technical Product Manager. Có thể nói rằng, vị trí này mở cho mình cánh cửa đến với nhiều cơ hội đa dạng trong tương lai.

Hai người bạn trẻ trong một lần đi Outing với công ty *shine bright*

Max: Giống như Ellie nói, mình cũng thấy những gì học được từ Test Automation nói riêng và QA nói chung có thể được áp dụng ở rất nhiều công việc khác nhau. Làm Test Automation Engineer, mình thấy chuyển hướng sang làm cả Business Intelligence Analyst cũng là điều hoàn toàn có thể xảy ra đấy! Vậy nên, nếu bạn nào còn đang e ngại về nghề tester, hãy thử một lần cởi mở và cơ hội này và thử sức với nó xem sao nhé.

Uyên Trần: Với những chia sẻ từ hai bạn, hy vọng các bạn đọc sẽ phần nào hiểu được chặng đường của một Test Automation Engineer. Chắc hẳn con đường phía trước sẽ còn nhiều thử thách, chúc các bạn sẽ tiếp tục vượt qua những khó khăn ấy và đạt được những thành công nhất định trong sự nghiệp làm tester của mình nhé!

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

Functional programing nên và không nên

functional-programing-nen-va-khong-nen

Bài viết được sự cho phép của tác giả Lưu Bình An

Luôn trả về giá trị

Luôn trả về giá trị, kể cả nhưng hàm chỉ tạo side-effect, ngoài ra giá trị trả về còn nên cố định luôn một kiểu, không nên lúc kiểu này lúc kiểu khác, giữ giá trị thô, đừng lưu giá trị đã định dạng (như format tiền tệ, ngày tháng), dùng tham số, đừng hard-code

❌ Không ngon

let result = 1;
for (let i = 2; i <= 5; i++) {
  result *= i;
}

console.log("Fact of 5: ", result);

✅ Chuẩn cơm mẹ nấu

const fact = (n) => (n === 0 ? 1 : n * fact(n - 1));

console.log("Fact of 5: ", fact(5));

Module hóa

Tách bạch một module chỉ làm một việc, và làm thật tốt việc đó

Xem thêm tuyển dụng javascript lương cao

Hợp thể ko kế thừa (composition vs. inheritance)

Kế thừa KHÔNG phải là cách chúng ta xử lý dữ liệu, behavior trong functional programing

Ghi nhớ khi cần thiết

Với pure function, việc ghi nhớ (memoize) kết quả được xem là an toàn vì cùng input-cùng output.

Ví dụ dùng hàm memize của thư viện Ramda

const fact = memoize((n) => (0 === n ? 1 : n * fact(n - 1)));

fact(5); // Calculates fact for 5, 4, 3 ...
fact(5); // Instantaneous
fact(3); // Instantaneous

Không thay đổi giá trị gốc

❌ Không ngon

var approved = [];

for (var i = 0; i < approved.length; i++) {
  if (users[i].score >= 7) {
    approved.push(approved);
  }
}

✅ Chuẩn cơm mẹ nấu

const approved = filter((user) => user.score >= 7, users);

Không dùng vòng lặp for

Mặc dù vòng lặp for nhanh nhất trong các vòng lặp, tuy nhiên nghiêm cấm sử dụng để tránh gây ra một side-effect không cố ý.

❌ Không ngon

const even = [];
for (let i = 0; i <= 300; i++) {
  if (i % 2 === 0) {
    even.push(i);
  }
}

console.log(even); // [0, 2, 4, 6, 8 ...]

✅ Chuẩn cơm mẹ nấu

import { filter, range } from "ramda";

const even = filter((n) => n % 2 === 0);

console.log(even(range(0, 300))); // [0, 2, 4, 6, 8 ...]

Không dùng switch...case

❌ Không ngon

const person = { name: "Wesley" };
let result;

switch (person.name) {
  case "Dayana":
    result = person.name + " is cool!";
    break;
  case "Wesley":
    result = person.name + " likes farting";
    break;
  default:
    result = "Who is " + person.name + "?";
}

console.log(result); // Wesley likes farting

✅ Chuẩn cơm mẹ nấu

import { T, cond, propEq } from "ramda";

const getDescription = cond([
  [propEq("name", "Dayana"), ({ name }) => `${name} is cool!`],
  [propEq("name", "Wesley"), ({ name }) => `${name} likes farting`],
  [T, ({ name }) => `Who is ${name}?`]
]);

console.log(getDescription({ name: "Wesley" })); // Wesley likes farting

Try…catch

❌ Không ngon

try {
  undefined.property;
} catch (err) {
  console.log(err);
}

✅ Chuẩn cơm mẹ nấu

import { tryCatch } from "ramda";
import { Either } from "ramda-fantasy";

const computation = tryCatch(
  () => undefined.property,
  Either.Right,
  Either.Left
);

console.log(computation()); // Left<TypeError>

Undefined và null

Không có giá trị (undefined, null) dẫn đến chuyện phải verify khá nhiều thứ và điều kiện nối điều kiện. Sử dụng Maybe

❌ Không ngon

const safeDiv = (a, b) => {
  if (b === 0) {
    return undefined;
  }

  return a / b;
};

console.log(safeDiv(20, 0) + 10); // Ops

✅ Chuẩn cơm mẹ nấu

import { Maybe } from "ramda-fantasy";

const safeDiv = (a, b) => (0 === b ? Maybe.Nothing : Maybe.Just(a / b));

safeDiv(20, 0).chain((result) => {
  console.log(result + 10); // Never falls here
});

Class

Nói chung, sử dụng class chúng ép buộc phải tạo ra effect và thao tác trực tiếp đến đối tượng gốc.

❌ Không ngon

class Person {
  setName(name) {
    this.name = name;
  }
  getName() {
    return this.name;
  }
}

let person = new Person();
person.setName("Cassandra");

✅ Chuẩn cơm mẹ nấu

import { lensProp, prop, set } from "ramda";

const setName = set(lensProp("name"));
const getName = prop("name");

const person = setName("Cassandra", {});

Đặt tên function

  • Có một động từ mô tả cái nó sẽ làm
  • Mô tả được bên trong nó làm cái gì (tất nhiên là ngắn gọn nhất có thể)
  • Nếu có cùng concept, sử dụng một từ chung
  • Chỉ làm một việc duy nhất
  • Không mô tả nó làm như thế nào
  • Nếu gặp khó khăn trong việc đặt tên function, có thể bạn đã không đúng khi gom quá nhiều xử lý vào nó (ôm đồm xử lý)

Bài viết gốc tại Vuilaptrinh

Xem thêm các việc làm ngành it công ty lớn tại đây