Home Blog Page 215

10 lời khuyên để giảm thiểu mối đe doạ an ninh nội bộ

Mối đe doạ nội bộ có thể gây rủi ro lớn hơn cho dữ liệu của công ty hơn các cuộc tấn công đến từ. Dưới đây là một số kỹ thuật giúp bạn phát hiện và giảm thiểu chúng càng nhanh càng tốt.

Một báo cáo gần đây được phát hành bởi Viện Critical Infrastructure Technology (ICIT) đã chỉ ra rằng hầu hết các sự cố cybersecurity (cố ý và tình cờ) là kết quả của một số hoạt động nội bộ.

Đầu năm nay, tôi đã giới thiệu một số cách để làm giảm nguy hiểm nội bộ. Là một người quan sát, tôi luôn muốn xem xét thêm các chiến lược có thể giúp người quản trị hệ thống nhanh chóng phát hiện và giảm nguy cơ rủi ro nội bộ – một yêu cầu quan trọng cho một thực  tế rằng một số vi phạm an ninh nội bộ đã không bị phát hiện ra trong 1 tuần, 1 tháng hay có thể là cả 1 năm.

Dưới đây là 10 lời khuyên để giảm thiểu mối đe doạ nội bộ.

1.Thành lập đội ngũ an ninh và phản ứng

Thậm chí nếu nó chỉ là 1 cá nhân, một đội ngũ chuyên dụng là điều cần thiết cho bảo mật thông tin. Nhóm này phải có trách nhiệm phát hiện, ngăn chặn và xử lý sự cố, cần phải có tài liệu, kế hoạch và thủ tục cho mỗi sự cố này. Đào tạo cho họ cũng như các nhân viên khác về an ninh để theo kịp trên các chiến thuật mới nhất cùng các mối đe dọa, đó là một yếu tố quan trọng trong việc xác định sớm các mối đe dọa.

  1. Sử dụng tài khoản tạm thời

Thiết lập cho các nhân viên của bên thứ ba (như các nhà thầu hoặc thực tập sinh) các tài khoản tạm thời. Với thời gian hiệu lực kết thúc vào ngày hết hạn hợp đồng hoặc dự án của họ. Điều này đảm bảo rằng các tài khoản này không thể tiếp cận khi các cá nhân rời đi. Bạn có thể gia hạn thêm thời gian tài khoản của họ nếu cần thiết.

  1. Tiến hành kiểm tra thường xuyên

Kiểm tra các tài khoản không sử dụng để vô hiệu hoá hoặc gỡ bỏ chúng nếu có thể

Cách đơn giản nhất là dùng lệnh ”dsquery” trên Windows Active Directory Domain Controller.

Giả sử bạn có một domain tên là company.com và bạn muốn kiểm tra tài khoản không được sử dụng trong 12 tuần vừa rồi. Gõ:

dsquery user dc=company,dc=com -inactive 12

Bạn có thể kiểm tra rõ ràng OU bằng cách chỉnh sửa lệnh trên. Ví dụ: Nếu tài khoản người dùng được lưu trữ tại CompanyUsers OU, bạn chỉ cần:

dsquery user ou=CompanyUsers,dc=company,dc=com -inactive 12

Bạn cũng có thể dẫn nó đến một tập tin văn bản nếu bạn muốn đề cập đến nó hoặc ghi lại tài liệu của bạn:

dsquery user ou=CompanyUsers,dc=company,dc=com -inactive 12 >> c:\inactive.txt
  1. Thực hiện nguyên tắc chấm dứt hợp đồng một cách cẩn thận.

Xoá quyền truy cập và vô hiệu hóa tài khoản càng sớm càng tốt khi nhân viên rời đi. HR và nhân viên nên tiếp xúc trực tiếp với các tài khoản khi nhân viên rời khỏi hoặc có một kế hoạch từ trước. Nhiều công ty tài chính cảnh báo với nhân viên IT trước về kế hoạch chấm dứt những nhân viên chủ chốt, để truy cập bị chặn lại khi họ chỉ vừa bước ra khỏi cửa.

  1. Xác định nhân viên không hài lòng

Nhân viên bất mãn có nhiều khả năng đưa ra mối đe dọa nội bộ với mong muốn để trả thù, một kế hoạch để ăn cắp dữ liệu và bán cho các đối thủ cạnh tranh, hoặc chỉ là sự tham. Không chỉ phải theo dõi, bạn nên nỗ lực để giảm bớt nguồn gốc của việc không hài lòng của họ, để cải thiện tình hình.

  1. Sử dụng xác thực 2 lần

Thường được mô tả như là “một cái gì đó bạn có và một cái gì đó bạn có biết”, ví dụ phổ biến nhất là sử dụng một RSA token mà hiển thị một chuỗi quay số mà bao gồm một mã xác thực. Người dùng cần phải gõ mật khẩu hoặc mã PIN thay đổi liên tục để được truy cập vào một hệ thống, vì vậy bất cứ ai có được mật khẩu hoặc token (nhưng không phải cả hai) sẽ bị chặn.

  1. Sử dụng mã hoá các dữ liệu

Cái này rất đơn giản; dữ liệu mã hóa sử dụng bất cứ phần mềm hoặc phần cứng công nghệ phù hợp với bạn, và chắc chắn rằng nó được lưu trữ hoặc chuyển đổi trên mạng. Bằng cách đó, nếu ai đó đang hack lưu lượng truy cập, đánh cắp một ổ cứng từ máy chủ, hoặc có được file sao lưu họ sẽ không thể có được các dữ liệu liên quan.

  1. Xem xét sản phẩm của bên thứ 3

Một trong những loại sản phẩm mà có thể giúp quản lý là giải pháp nhận dạng, nó có thể cung cấp các quyền truy cập qua việc nhận dạng cá nhân.

Công tác phòng chống mất mát dữ liệu và giám sát hoạt động của người dùng của được tham chiếu trong báo cáo của ICIT là hai giải pháp quan trọng để giảm thiểu rủi ro nội bộ.

Theo kinh nghiệm, một sản phẩm như Tripwire cũng có thể là một món quà ở đây. Tripwire kiểm soát hệ thống và thông báo cho bạn khi có thay đổi bất kỳ yếu tố nào trên chúng, chẳng hạn như một tập tin mật khẩu, một bảng tính bí mật hoặc một khoá SSH. Bây giờ, nhiều tập tin có thể và thay đổi mỗi ngày, vì vậy có thể có một tỉ lệ cao các tín hiệu nhiễu lúc đầu, nhưng bạn sẽ có thể để lọc ra các hoạt động bình thường từ các hoạt động bất thường sau khi thiết lập các cơ sở mẫu của các hoạt động để phát hiện các hành vi đáng ngờ.

  1. Đừng quên bảo vệ từ phía ngoài

Còn nhớ bộ phim “When a Stanger Call”? Trong phim một người giữ trẻ giữ nhận được cuộc gọi điện thoại đe dọa và có cảnh sát theo dõi họ, sau đó đã nói, “chúng tôi đã tìm ra… cuộc gọi nó đến từ bên trong nhà!” Bạn có thể tranh luận rằng điều này là mối đe dọa nội bộ cuối cùng, nhưng phải luôn suy nghĩ rằng các đối thủ đã trà trộn vào bằng cách nào đó. Đừng nghĩ rằng bạn chỉ bảo vệ phần mạng nội bộ; tập trung các sáng kiến an ninh và các nỗ lực trên tất cả các thiết bị bên ngoài.

  1. Hãy xem xét đầu tư vào các sản phẩm và đội ngũ nhân viên nhiều, hơn chỉ là “bảo hiểm”

Đây thực sự là một suy nghĩ hơn là một lời khuyên, nhưng nó có giá trị thảo luận. Quá nhiều giám đốc điều hành dường như nghĩ rằng các sản phẩm an ninh là chỉ bảo hiểm, họ phải trả tiền cho nó hoặc nếu không thì điều gì tồi tệ có thể xảy ra. Đó là cách tiếp cận sai lầm và có thể ảnh hưởng ngân sách. Chắc chắn chúng tôi không xem cảnh sát như một sự lãng phí trong ngân sách thành phố, đặc biệt là khi chúng tôi cần sự giúp đỡ của họ.

Nhiều công nghệ và sản phẩm tôi đã thảo luận rằng có thể làm nhiều hơn là chỉ cung cấp bảo mật. Ví dụ như Splunk,có thể gửi các thông báo liên quan đến tất cả các loại vấn đề hệ thống như sự hư hại phần cứng hoặc khả năng vượt quá ngưỡng. Thực hiện tốt về bảo mật có thể làm giảm giám sát (hoặc hình phạt) từ kiểm toán cho công ty. Và điều quan trọng là hãy nhớ rằng chi tiêu một chút (hoặc nhiều) về bảo mật có thể giúp ngăn ngừa các chi phí lớn hơn xuất hiện, chẳng hạn như doanh thu bị mất trong sự phát tán dữ liệu công cộng.

Nguồn: techrepublic.com

12 hành động nhỏ của nhân viên được lãnh đạo coi trọng “như vàng”

12 hành động nhỏ của nhân viên được lãnh đạo coi trọng

Nhìn lại cách đây 13, 14 năm, lúc mình còn đi làm ăn lương và đạt được sự thăng tiến tốt và có được ngày hôm nay là cả một hành trình dài. Những đức tính bên dưới đã giúp mình và chắc chắn sẽ giúp bạn phát triển hơn bao giờ hết, cho dù bạn là nhân viên hay chủ doanh nghiệp cũng nên ghi nhớ. Đọc hết nhé!

Trong công việc đa số nhân viên đều mong muốn có được sự coi trọng và tín nhiệm của lãnh đạo, tuy nhiên muốn được lãnh đạo coi trọng và tín nhiệm lại hoàn toàn phụ thuộc vào sự biểu hiện cụ thể của bạn.

Một khi bạn đã không được lãnh đạo tín nhiệm, dù bạn có làm được bao nhiêu việc đi nữa, sau này cũng không thể phát triển theo chiều hướng tích cực hơn được. Vì vậy, chúng ta phải làm sao để được lãnh đạo coi trọng và tín nhiệm đây?

1. Sự trung thành

  • Đứng trên lập trường của lãnh đạo để suy nghĩ
  • Chia sẻ suy nghĩ của bạn với cấp trên
  • Luôn bảo vệ lợi ích của công ty
  • Tìm cách kiếm tiền về cho công ty
  • Vượt qua mọi cám dỗ từ bên ngoài

Công ty có thể sẵn sàng sa thải nhân viên có năng lực, nhưng đối với một nhân viên trung thành sẽ không có một lãnh đạo nào muốn cho anh ta ra đi, anh ta sẽ trở thành một chiến sĩ thép trong công ty và sẽ trở thành nhân viên có tương lai phát triển nhất trong công ty sau này.

2. Sự đam mê với công việc

  • Mục đích của công việc không phải chỉ vì mỗi mức lương
  • Nỗ lực phục vụ hết mình, thậm chí vượt qua cả mức lương
  • Hy sinh việc cá nhân vì công việc
  • Không quan tâm đến khái niệm hết giờ làm là đi về, mà làm xong việc mới nghĩ đến nghỉ ngơi.
  • Coi trọng từng chi tiết trong công việc

Với sự tiến bộ từng ngày của xã hội, nhận thức của con người cũng hội tụ nhiều cái thay đổi. Bằng cấp, học lực không còn là điều kiện tiên quyết cho sự tuyển dụng nhân viên trong các công ty. Mà rất nhiều công ty cần sự đam mê, sự tận tâm với công việc của nhân viên, tiếp đó mới đến trình độ chuyên môn.

3. Tính tích cực trong công việc

  • Từ “ muốn tôi làm” thành “tôi muốn làm”
  • Chủ động gánh vác thêm một số việc ngoài công việc mình được phân công
  • Làm trước, nói sau để lãnh đạo vụi vẻ ngạc nhiên (khác với nhiệt tình + thiếu hiểu biết)
  • Xung phong và chủ động làm việc
  • Yêu cầu một phải làm được ba

Đừng để việc gì cũng phải đợi phân công mới làm, mà chúng ta nên chủ động làm tốt tất cả, dù khởi điểm có kém hơn người khác thì chúng ta cũng sẽ phát triển được nhanh chóng.

4. Có tinh thần trách nhiệm trong công việc

  • Bất cứ việc gì, kể cả việc nhỏ nhất cũng phải làm tốt
  • Nói là phải làm, mà làm là phải có kết quả
  • Sai là sai, đừng tìm cách biện minh
  • Không vì sơ suất nhỏ mà hình thành sai lầm lớn

Năng lực cá nhân có thể thua kém người khác nhưng tinh thần trách nhiệm thì không thể không có, nếu gặp việc gì cũng đùn đẩy, đổ cho nguyên nhân khách quan mà không tự ngẫm lại bản thân thì bạn sẽ dễ dàng đánh mất sự tín nhiệm của lãnh đạo.

5. Tính hiệu quả trong công việc

  • Tạm biệt những việc không đâu vào đâu
  • Tập trung chuyên tâm với công việc
  • Làm nhiều, làm tốt, làm cẩn thận từng công việc
  • Nói không với sự trì trệ, ngăn chặn sự cầu toàn khiến làm giảm hiệu quả công việc
  • Luôn ghi nhớ và biết sắp xếp công việc nào cần ưu tiên làm trước

Thói quen làm việc phải đem lại hiệu quả cao là điều cần thiết đưa bạn đến thành công, và cũng là điều được các công ty vô cùng xem trọng.

6. Kết quả công việc

  • Ngay từ khi bắt tay làm là phải nghĩ cách làm sao hoàn thành công việc
  • Phương pháp luôn luôn nhiều hơn vấn đề
  • Làm việc một cách thông minh chứ không phải chỉ là làm việc chăm chỉ
  • Không có điều kiện vậy hãy tự tạo điều kiện
  • Hoàn thành công việc sớm hơn dự kiến

“Bất kể mèo đen hay mèo trắng, mèo nào bắt được chuột thì đó là con mèo giỏi”. Bất kể bạn làm việc chăm chỉ, hay làm việc thông minh, miễn đạt kết quả tốt thì bạn sẽ được mọi người công nhận. Doanh nghiệp xem trọng bạn lập được bao nhiêu “công lao”, chứ không phải xem bạn vất vả thế nào.

7. Khả năng giao tiếp

  • Giao tiếp khác với buôn chuyện
  • Không nói hoặc nói quá nhiều cũng là một sai lầm
  • Đưa vấn đề ra bàn luận và đưa ra phương pháp giải quyết
  • Tiếp thu sự phê bình
  • Nội bộ có thể có mâu thuẫn nhưng ra ngoài phải đồng lòng

Người giao tiếp kém dù có tài cũng khó mà tiến bộ được, còn người giỏi giao tiếp dù có bình thường thì họ có thể vừa làm vừa học nên nhanh chóng chứng minh được giá trị bản thân.

8. Tinh thần đoàn kết

  • Hòa đồng với tập thể
  • Tuân theo sự sắp xếp của tập thể
  • Tuân thủ kỷ luật mới đảm bảo được năng lực chiến đấu
  • Suy nghĩ và làm được nhiều việc hơn cho tập thể

Bất kể bạn tài giỏi ra sao, nếu như bạn làm tổn hại đến tập thể, doanh nghiệp cũng sẵn sàng sa thải bạn. Đừng ảo tưởng rằng vì thiếu một mình bạn mà tập thể không thể làm nên việc gì.

9. Sự cầu tiến

  • Luôn học hỏi và cầu tiến
  • Đừng để kinh nghiệm một năm dùng lặp lại cho mười năm
  • Dùng thời gian để nâng cao năng lực bản thân, nạp năng lượng mới cho mình
  • Phát triển lợi thế, ưu điểm của bản thân

Mỗi người cần phải theo kịp với tốc độ phát triển của doanh nghiệp, còn doanh nghiệp phải bắt kịp tốc độ phát triển của thị trường. Vì vậy bất kể trong công sở hay thị trường, cá nhân hay doanh nghiệp, đều không muốn mình bị đào thải thì cần phải cầu tiến, đứng yên tại chỗ tương đương với từ bỏ, và bị gạt ra ngoài.

10. Sự khiêm tốn

  • Đừng khoe công đòi thưởng
  • Khắc phục tâm lý “ta giỏi mà làm việc không xứng tầm”
  • Tôn trọng tất cả mọi người
  • Nỗ lực làm việc, xứng đáng với vị trí của mình
  • Thành tích chỉ là khởi đầu, vinh dự làm nên động lực

Tài giỏi nhưng chớ tự cao, đừng nghĩ rằng nếu mình không khoe, không kể ra thì người khác không biết đến công lao của bạn, đừng có khoe khoang trước mặt đồng nghiệp.

11. Sự thành thật

  • Báo cáo doanh thu cần trung thực
  • Đừng tham cái lợi trước mắt
  • Không lãng phí tiền của của công ty, dù chỉ là một trang giấy
  • Trân trọng từng phút làm việc
  • Ghi nhớ rằng: những thứ mình tiết kiệm được cho công ty đó cũng là lợi nhuận.

Tiết kiệm không phải là keo kiệt, mà là một đức tính tốt. Đừng nghĩ rằng tiền của công ty không phải là tiền, mà hãy nhớ rằng “nồi” của công ty có gì, “bát” của ta sẽ có cái đó, “nồi” của công ty có nhiều, “bát” của ta ắt sẽ đầy, và người cầm thìa múc lại chính là chúng ta.

12. Lòng biết ơn

  • Cảm ơn sếp cho bạn cần câu cơm
  • Cám ơn công việc không chỉ đem lại cho bạn tiền lương mà còn cho bạn nhiều kinh nghiệm và bài học.
  • Cảm ơn đồng nghiệp hỗ trợ, giúp đỡ bạn
  • Cảm ơn khách hàng cho bạn cơ hội làm nên thành tích
  • Cảm ơn đối thủ cho bạn sự trưởng thành
  • Cảm ơn người phê bình bạn khiến bạn hoàn thiện bản thân hơn

Tại sao chúng ta có thể chấp nhận được những sai lầm của bản thận mà đối với người khác hay công ty lại không ngừng khó chịu và phàn nàn. Bạn nên biết rằng, dù bạn có tài giỏi thế nào thì đôi khi bạn vẫn cần người khác cho bạn cơ hội để thể hiện hay có khi cần sự giúp đỡ dù to dù nhỏ từ người khác. Hạnh phúc hiện tại của bạn không phải do một mình bạn có thể làm nên.

Nguồn: Applancer Careers via Trí Thức Trẻ

Beautiful UX và ứng dụng Real Time cải thiện trải nghiệm người dùng

Beautiful UX và ứng dụng Real Time cải thiện trải nghiệm người dùng

Vài năm trước đây, công nghệ như WebSockers đã đạt được những phát triển vượt bậc nhờ vào sự trợ giúp của tính năng Real time. Sau này tính năng Real time được phát triển và được xem như một tính năng “ không – thể – thiếu” trong hầu hết các ứng dụng được yêu thích hiện nay như: Facebook với thông báo qua ứng dụng điện thoại, Uber với hiệu ứng dò tìm địa điểm ngay lập tức, tính năng đa người dùng của Google Docs và chat trực tuyến của Slack,… Tính năng real time có tác dụng truyền tải thông tin đến người dùng ngay tức thì, làm gia tăng những trải nghiệm chân thực nhất cho người dùng. Nhưng làm thế nào để áp dụng tính năng Real time giúp cải thiện sản phẩm và đáp ứng mong muốn của khách hàng?

Anh Đỗ Vũ Hoàng Trình – Director of Project Management của POETA, với nhiều năm kinh nghiệm trong lĩnh vực cung ứng giải pháp trải nghiệm người dùng, trong buổi trò chuyện gần đây với TopDev đã có những chia sẻ quý báu về kinh nghiệm cải thiện trải nghiệm người dùng, cũng như những vấn đề cần quan tâm khi tích hợp tính năng real time vào ứng dụng để cải thiện trãi nghiệm người dùng.

1. Anh có thể giới thiệu đôi nét về POETA cho cộng đồng lập trình viên được biết?

Được thành lập năm 2007 với 2 chi nhánh ở Seattle (Mỹ) và ở Việt Nam tên công ty ban đầu là VinaSource. Mục đích là giúp khách hàng dễ đọc, nhanh chóng biết được công ty đang làm gì ? ở đâu? Nhưng qua thời gian thì vấn đề dễ đọc không còn là yếu tố quan trọng hàng đầu, công ty mong muốn mang đến nhiều cảm xúc hơn cho khách hàng, bắt đầu từ chính tên công ty, vì vậy công ty đã quyết định đổi tên thành POETA. Sở dĩ có cái tên POETA (tiếng La Tinh) có nghĩa là nhà thơ, với POETA code không chỉ đơn thuần là code, nó phải thực sự tinh tế mang lại cảm xúc, mang lại giá trị cho người dùng. POETA không tham vọng tạo ra những sản phẩm hàng trăm ngàn người dùng, nhưng mỗi sản phẩm POETA tạo ra là một “tác phẩm nghệ thuật” chính là mang lại cảm xúc cho người dùng.

2. Anh có thể chia sẻ thêm về dự án mà anh tâm đắc nhất cho tới thời điểm hiện tại?

Từng làm qua rất nhiều sản phẩm, nhưng sản phẩm khiến anh tâm đắc nhất cho tới bây giờ đó là 1 sản phẩm về giáo dục từ khách hàng Mỹ. Sản phẩm này cung cấp thư viện những bài test hỗ trợ cho giáo viên đánh giá năng lực sinh viên. Nhớ lại khi đó team chỉ có 2 người, gần như phải tự làm tất cả mọi thứ. Điều khó khăn nhất là khâu thuyết phục khách hàng chấp nhận giải pháp của mình đưa ra thay vì bằng lòng với giải pháp của khách hàng. Giải pháp bên mình đưa ra là một giải pháp toàn diện cả về business chứ không chỉ là giải pháp về kỹ thuật – điều mà rất ít công ty Outsource lúc bấy giờ quan tâm đến. Từ những ngày đầu rất sơ khai bây giờ sản phẩm đó có thể tự scale để đáp ứng được lượng người dùng truy cập lớn. Từ quá trình làm sản phẩm đó, mình học được rất nhiều điều quý báu: quy trình làm hệ thống, biết cách nói chuyện với khách hàng, hiểu khách hàng, làm sao để thiết kế hệ thống đáp ứng được nhiều người dùng,…

3. Tính năng Real time hiện nay được xem là “tính năng không thể thiếu” trong hầu hết các ứng dụng được yêu thích hiện nay, được biết hiện tại POETA cũng có phát triển một số sản phẩm liên quan tới tính năng này, anh có thể chia sẻ thêm về việc áp dụng Real time vào sản phẩm của công ty?

Việc áp dụng tính năng real time vào sản phẩm cải thiện trải nghiệm người dùng rất nhiều. Hiện tại POETA có phát triển một số tính năng real time liên quan đến video. Một sản phẩm mà POETA đã phát triển có áp dụng real time khá thành công liên quan đến du lịch tại chỗ. Về cơ bản sẽ có 1 người là tourguide làm nhiệm vụ hướng dẫn, người dùng sẽ thông qua ứng dụng di động để “điều khiển” tourguide di chuyển theo mong muốn của mình, đi đến những nơi mình muốn, tất nhiên đó hoàn toàn là Real Time. Điều này khiến cho người dùng ứng dụng có được những trải nghiệm du lịch chân thực mà không cần phải đến tân nơi, chỉ cần dùng thiết bị di động.

Khi làm Reat Time cần lưu ý về chất lượng tải, vì làm real time (đặc biệt là với video) phụ thuộc rất nhiều vào đường truyền. Bài toán cần giải quyết là tối ưu hóa tốc độ tải, để ngay cả khi người dùng sử dụng gói dịch vụ giá rẻ thì tốc độ đường truyền vẫn phải đảm bảo, và cần phải chủ ý tới khả năng tự động phát hiện lỗi và cách khắc phục lỗi nhanh nhất.

4. POETA đã có nhiều năm làm việc với trải nghiệm người dùng, vậy anh quan niệm như thế nào là “Beautiful UX”?

Thực ra “đẹp” hay” xấu” cũng chỉ là mang tính cảm tính, có rất nhiều định nghĩa khác nhau về “beautiful UX” như cấu trúc cân đối, đơn giản, tiện dụng, dễ sử dụng,.. Còn đối với anh thì đó là “thôi thúc” hành động.

Beautiful UX phải mang đến trải nghiệm thôi thúc người dùng thực hiện 1 hành động nào đó. Ví dụ: khi làm1 trang web bán hàng phải thôi thúc mua hàng, 1 trang book vé thì phải thôi thúc người dùng book vé.

Để có thể làm được điều đó, điều quan trong nhất là phải hiểu được người dùng. Vì mỗi đối tượng khách hàng khác nhau có đặc điểm nhân khẩu học khác nhau ví như: khách hàng ở Mỹ họ thích những thiết kế đơn giản, rõ ràng với 1 text box rất lớn. Bởi khuynh hướng của người dùng ở Mỹ là vào 1 website là để làm gì đó, còn đối với người dùng ở Nhật, Hàn thì lại rất nhiều chữ và nhiều màu, đối với họ thì nhiều là tốt, nhiều có nghĩa là có nhiều giá trị. Còn đối với người dùng Việt Nam thì vào website là để xem có gì hấp dẫn, thì mới quyết định có hành động tiếp theo. Thói quen người dùng khác nhau, đó là lý do phải nghiên cứu hành vi người dùng thật kỹ trước khi đưa ra thiết kế. Có như vậy mới cho người dùng cái họ muốn.

5. Có ý kiến cho rằng: “Làm Outsource không có tư duy sản phẩm” với nhiều năm kinh nghiệm là Outsource anh nghĩ gì về ý kiến này?

Thực ra, ý kiến này cũng không hoàn toàn sai. Ở Việt Nam hiện nay chủ yếu vẫn làm Outsource cho các công ty nước ngoài là chủ yếu, rất ít có cơ hội được tiếp xúc trực tiếp với khách hàng, cái mình nhận được chỉ là những yêu cầu. Sự tách biệt với khách hàng là nguyên nhân dẫn đến thiếu tư duy về sản phẩm. Hơn nữa, trong chuỗi quy trình từ tạo ra sản phẩm tới đưa sản phẩm tới người dùng, lập trình viên Outsource chỉ làm ở giai đoạn hiện thực hóa sản phẩm, nhiều khi không được tham gia cả khâu thiết kế, và khâu quan trọng nhất là lấy ý kiến người dùng thì gần như hoàn toàn không được tham dự. Chính vì vậy, tư duy Outsource cũng bắt đầu từ đó. Muốn thay đổi tư duy điều quan trọng là cần có bước chuyển.

Nhìn về bản chất một chút, trong chuỗi giá trị của người dùng, từ giai đoạn nắm bắt nhu cầu người dùng, lên ý tưởng, thiết kế, build sản phẩm, marketing, logictic,… có rất nhiều việc mình có thể làm. Để bắt đầu thì mình cần phải làm tốt hơn yêu cầu của khách hàng. Các công ty Outsource thường suy nghĩ đơn giản là khách hàng yêu cầu gì thì chỉ làm vậy, như thế sẽ không thể làm tốt hơn yêu cầu của khách hàng, tức là đưa ra nhiều lựa chọn tốt hơn (có thể) thay thế cho giải pháp của khách hàng. Để làm được điều đó cần xem khách hàng như những partner của mình, tức là cùng khách hàng phát triển sản phẩm, cùng xây dựng sản phẩm, hơn là chỉ xem khách hàng đơn thuần là những người đưa ra yêu cầu và mình là người thực hiện yêu cầu. Khi đó mình đã có tư duy cùng với khách hàng rồi, mình có thể làm trọn gói phân tích nhu cầu người dùng của họ, sau này mình không chỉ duy trì về mặt công nghệ mà mình còn có thể tham gia vào nhiểu phần khác trong chuỗi giá trị sản phẩm. Đó chính là bước đầu hình thành nên tư duy sản phẩm dù làm Outsource hay làm Product.

6. Anh có thể chia sẻ đôi chút về văn hóa công ty ở POETA?

Môi trường làm việc ở POETA khá thỏa mái, trẻ trung, năng động, khuyến khích sự sáng tạo, nhưng cũng đòi hỏi sự chuyên nghiệp.

Ở POETA không đòi hỏi các bạn lập trình viên phải biết quá nhiều công nghệ, điều các bạn cần nhất là kiến thức căn bản tốt và nắm được tinh thần của ứng dụng mình làm. Mình tâm niệm, công nghệ chưa biết, làm sẽ biết, ngoài ra công ty cũng thường xuyên tổ chức các buổi training cho nhân viên, nên các bạn không cần quá lo lắng.

7. Đối với các bạn lập trình viên ứng tuyển vào POETA, anh có lời khuyên gì dành cho các bạn?

Một điều nữa anh rất quan tâm khi phỏng vấn các bạn lập trình viên là một CV ấn tượng. Anh thấy nhiều bạn ứng viên rất tiềm năng nhưng đọc CV rất chán, hay liệt kê khả năng này, bằng cấp nọ, làm ứng dụng kia,… Nhưng điều anh thực sự muốn biết là các bạn đã làm được gì trong từng dự án và kết quả đạt được là gì thì gần như không thấy. Các bạn lập trình viên cần viết CV sao cho toát lên được giá trị của bản thân, cho nhà tuyển dụng thấy được đam mê của các bạn.

Anh cũng đánh giá rất cao những bạn có đam mê, bởi có đam mê bạn sẽ luôn biết cách làm thế nào để làm tốt mọi việc. Đôi khi niềm vui của coder chỉ là code ra 1 dòng code rút ngắn được thời gian, cảm giác rất “sướng”. Chính anh cũng từng là lập trình viên anh hiểu rõ cảm giác đó như thế nào. Nói về code nhiều bạn vẫn nghĩ là “thợ” nhưng thợ có tâm khác rất nhiều với thợ bình thường. Anh có lời khuyên với các bạn nào cảm thấy code là một gánh nặng thì nên chuyển sang các lĩnh vực khác.

Cảm ơn anh đã nhận lời tham gia phỏng vấn cùng TopDev

Làm thế nào để chọn được framework phát triển Mobile app tốt nhất?

Sự khác biệt trong cách phát triển các ứng dụng Hybird và Native Cross Platform cùng các yếu tố tác động

Hybird cross platform framework là một bộ công cụ phát triển, cấu hình và xây dựng, cho phép các công nghệ web chuẩn (HTML, CSS và JavaScript 5, 3) đã được đóng gói và triển khai trên thiết bị di động.Thông thường, các assests sẽ được tải lên Apple Store đối với iOS và Playstore đối với Android. Trong thời gian runtime, ứng dụng sẽ sử dụng trình duyệt web trên mobile (webview).

Xem thêm tuyển mobile app lương cao

Native cross platform framework cũng có cách hoạt động giống như phương pháp Hybird. Tuy nhiên, nó cắt HTML và CSS từ phương trình và cho phép các ứng dụng đã được đóng gói nói chuyện trực tiếp với hệ điều hành điện thoại di động. Điều này cung cấp hai lợi thế hơn Hybird. Trước hết, các ứng dụng có thể sử dụng native user interface để điều khiển (chứ không chỉ bắt chước), điều này có thể phát triển dễ dàng hơn kể từ khi có sự nhất quán trong thiết bị và các ứng dụng có khả năng sẽ chạy nhanh hơn (kể từ khi có ít quy trình cần xử lí hơn)

Phương pháp Native sử dụng các công cụ nguyên bản của Apple và Google nhằm target các thiết bị di động. Chúng được phát triển độc lập và sử dụng ngôn ngữ khác nhau cùng môi trường phát triển trong từng ngữ cảnh.

Các yếu tố quyết định framework phù hợp

Cần cân nhắc 4 yếu tố chính khi chọn một framework để phát triển mobile app phù hợp như sau:

Tốc độ

Điều đầu tiên cần cân nhắc chính là tốc độ khi app chạy. Các app có tốc độ nhanh thường là  native app viết bởi Java ( Android) và Swift (IOS) sau đó là native cross platform và cuối cùng là Hybird. Đáng chú ý là sự khác biệt về tốc độ giữa các app là không đáng kể và chỉ quan trọng nếu bạn đang phát triển các ứng dụng games. Tốc độ vàng khi nói đến phát triển ứng dụng di động là 60fps. Nếu ít hơn sẽ được coi là “laggy”. Thường khi sử dụng Hybird sẽ không đạt được con số vàng này.

Tính năng hỗ trợ

Nếu bạn xây dựng cross platform app thì có thể sẽ có nhiều tính năng đặc biệt mà cross platform và hybird framework không hỗ trợ. Thường các tính năng sẽ được add thêm bởi maintainer của các framework này tuy nhiên thời gian sẽ rất lâu.

Rủi ro liên quan đến framework

Bằng các chọn shop bên ngoài các framework được hỗ trợ chính thức việc phát triển mobile app (Android Studio / Xcode) bạn sẽ gặp nhiều rủi ro hơn vì bạn đã đặt nhiều layers của abstraction và nền tảng mục tiêu và code đang chạy trên đó

Đây không phải là vấn đề nhưng bạn nên tìm kiếm các hợp đồng hỗ trợ mà bất kỳ nhà phát triển Hybrid hoặc Cross Platform cung cấp. Hãy thử tìm kiếm online và tìm hiểu những vấn đề người ta gặp phải với các framworks trước khi tiến hành và thực hiện sự lựa chọn của bạn.

Chi phí

  • Bạn nên suy nghĩ về kinh nghiệm phát triển hiện tại mà bạn đã có hoặc có thể dễ dàng tìm hiểu từ bên ngoài. Nếu bạn có nhiều web dev thì Hybrid lựa chọn tốt nhất vì nó cung cấp khả năng tiết kiệm chi phí thúc đẩy bởi vì nó cần ít thời gian để học hơn
  • Sử dụng cross platform sẽ cho phép chia sẻ mã và do đó làm giảm đáng kể chi phí phát triển.

Nguồn: topdev.vn via logicroom.co

Cách viết CV dành cho Software Developer

Cách viết CV dành cho Software Developer

Bài này do mình, một IT Technical Recruiter viết; đối tượng hướng tới là các bạn Software Developers đã có kinh nghiệm làm việc.

  • Bài này cũng thể hiện quan điểm và sở thích cá nhân khi nhận và đọc CV của ứng viên, nó không phải là chuẩn chung cũng như sẽ có thể khác hoặc trái ngược quan điểm của các recruiter hay nhà tuyển dụng khác, vậy nên các bạn đọc kỹ hướng dẫn sử dụng trước khi dùng, đừng chết vì lười đọc.
  • Bài này được viết do ngẫu hứng, không được chuẩn bị trước, chủ yếu dựa trên những bức xúc bấy lâu khi đọc CV của ứng viên, nên chắc chắn sẽ có nhiều vấn đề chưa đề cập đến. Ai muốn bổ sung hay góp ý hay gì gì đó thì cứ email cho mình (khuyen.le-minh @ jobseeker.vn)
  • Mình viết dựa trên kinh nghiệm làm việc với các công ty nước ngoài, nên bài viết có thể sẽ không đúng với các bạn muốn apply vào các cty Việt Nam hay Nhà nước.
  • Không có cách viết hay mẫu CV/Resume nào gọi là chuẩn cho tất cả, mà nó tùy thuộc và kinh nghiệm bản thân, ngành nghề cũng như yêu cầu của nhà tuyển dụng.

Đầu tiên cần phân biệt giữa CV (Curriculum Vitae) và Resume (or Résumé)

  • CV: Viết dài, ghi chi tiết về thời gian, các kinh nghiệm, kỹ năng, quá trình học tập, etc .. CV cover toàn bộ quá trình sự nghiệp của bạn. Thường thì CV tốn nhiều trang A4 để viết (tầm 2~4 trang là đẹp). CV chuyên dùng để bạn show hàng đến từng sợi lông cho nhà tuyển dụng thấy
  • Resume: Ngắn gọn, súc tích, chỉ thể hiện những ý chính, thành tích nổi bậc, không đi sâu vào chi tiết. Thường thì Resume chỉ nên gói gọn trong 1 trang,. Resume rất hiệu quả để bạn bước ra khỏi đám đông, cho recruiter một cái nhìn overview về bạn,, giúp bạn nổi bậc hơn so với hàng chục hay hàng trăm ứng viên khác.

>>> Xem thêm: Resume và CV là gì? Điểm khác biệt quan trọng khi xin việc

Hai thứ này tạm dịch ra tiếng Việt là Sơ yếu lý lịch, nhưng nó không giống với Sơ yếu lý lịch mà các bạn hay đem ra phường chứng thực, nên không cần phải ghi số CMND, nhà có mấy anh chị em, ba má trước 1975 làm gì hay ở đâu…. Cái này tập trung vào bạn, kinh nghiệm làm việc cũng như kỹ năng của bạn, và không cần phải ra phường để xác nhận.

Cá nhân mình là recruiter và mình thích các bạn gửi cho CV mình hơn. Resume không thích hợp cho developer vì nó quá ngắn, recruiter không đủ dữ liệu để đánh giá về kinh nghiệm cũng nhưng kỹ năng của các bạn, nhất là các recruiter không có background hay knowledge bên mảng IT.

Nên viết CV bằng tiếng Việt hay tiếng Anh

  • Đầu tiên là bạn phải xem kỹ công ty yêu cầu nộp CV bằng tiếng Việt hay tiếng Anh. Nếu họ không đưa yêu cầu cụ thể, thì bạn nên tìm hiểu xem đó là cty của nước nào, nếu không phải là công ty của Việt Nam thì nên nộp hồ sơ bằng tiếng Anh. Ngoài ra một số công ty có thể yêu cầu CV bằng tiếng Trung hay tiếng gì đó mà họ thích.
  • Còn riêng cá nhân mình thì mình thích nhận CV tiếng Anh hơn. Nếu bạn gửi CV tiếng Việt cho mình, mình sẽ reply lại và yêu cầu 1 CV khác bằng tiếng Anh.

>>> Xem thêm: Các mẫu CV IT đẹp dành cho lập trình viên

Nên viết gì trong CV?

Personal Information:

  • Họ và tên đầy đủ, nên viết bằng tiếng Việt không dấu (thật ra có dấu cũng được, nhưng mình thích không dấu hơn)
  • Thông tin liên lạc: chuẩn nhất là có email, số điện thoại di động và địa chỉ liên lạc để recruiter có thể liên lạc bạn theo cách nhanh nhất (điện thoại) và formal (email) và gửi thư từ, giấy tờ cho bạn (địa chỉ liên lạc, chứ không cần phải ghi địa chỉ hộ khẩu). Tuy nhiên, nếu có skype hay yahoo thì cũng tiện lợi trong nhiều trường hợp. Ngoài ra còn có thể đưa link của blog/web cá nhân, profile trên Linkedin, gitHub hay stackoverflow, …. Tóm lại, thông tin liên lạc và những thứ liên quan có focus vào công việc
  • Hình: Có nhiều quan điểm trái ngược nhau về việc có nên để hình vào CV hay không. Theo mình thì nếu bạn tự tin bạn đẹp trai hay xinh gái khi lên hình thì hãy để vào, còn không thì không cần, không nên. Tuy nhiên,  nếu bạn không để hình và tên của bạn nó lưỡng tính, khi người ta đọc vào không (hay khó) phân biệt là trai hay gái (ví dụ như mình là male, tên là Lê Minh Khuyến, nếu không để hình thì 7/10 người kêu là *chị*), thì bạn nên để thêm phần giới tính vào, không quan trong lắm, nhưng để tránh nhầm lẫn.

Career Objective/Goals

Hãy cẩn thận khi bạn đưa mục này vào CV, vì nó có 2 mặt

  • Tích cực: thể hiện cho nhà tuyển dụng thất tinh thần cầu tiến, đặt mục tiêu và có kế hoạch của bạn, có thể goal của bạn phù hợp với công ty.
  • Tiêu cực: nhà tuyển dụng có thể cho rằng mục tiêu của bạn không phù hợp với vị trí bạn đang làm, có thể bạn sẽ không gắn bó với cty, ….. Ví dụ: 1 công ty tuyển người cho vị trí .NET Developer, trong job description có ghi “If your career objectives have the non-technical path within the next xxx years, this position is not suitable for you”, nhưng bạn ghi objectives là muốn trở thành Project Manager trong 5 năm tới thì coi như thua hết 70% cuộc chơi rồi.

Career Summary

  • Có thể có hoặc không có mục này, cái này nó chỉ đơn giản là liệt kê lại thời gian nào bạn đã làm ở công ty nào và ở vị trí gì, giúp recruiter có cái overview về jobs và số năm kinh nghiệm của bạn
  • Nếu liệt kê, bạn hãy ghi theo thứ tự thời gian từ gần đây nhất trở về trước

Technical Skill Summary:

  • Có thể có hoặc không, nó chỉ đơn giản là liệt kê những technical skills mà bạn biết, có kinh nghiệm sử dụng, ….
  • Tuy nhiên, nếu bạn public CV của bạn lên internet, thì mục này rất hữu ích giúp CV của bạn dễ dàng được recruiter tìm thấy thông qua search engines

Professional Experience/Employment History

  • Phần này quan trọng nhất và khó nhất, hãy liệt kê theo thứ tự thời gian từ gần nhất đến cũ nhất các công việc bạn đã làm
  • Mỗi một công việc, bạn cần ghi đầy đủ *tên công ty, tháng/năm bắt đầu làm – tháng/năm nghỉ việc, vị trí*. Bên dưới, hãy gạch đầu dòng những trách nhiệm/công việc chính của bạn khi làm ở vị trí đó. Cố gắng ghi ngắn gọn nhưng đủ ý, tránh dài dòng hay đi sâu vào chuyên môn.
  • Nếu bạn đã làm qua nhiều công ty/vị trí thì CV sẽ rất dài khi liệt kê hết, bạn có thể:
  • Chỉ liệt kê những công việc trong thời gian vài năm trở lại
  • Chỉ liệt kê những công việc giúp cho CV bạn phù hợp hơn so với vị trí bạn sắp ứng tuyển
  • Ngoài ra, là developer, bạn có thể trình bày kinh nghiệm làm việc theo cách khác, đó là liệt kê theo những dự án bạn đã làm:

Tên dự án (nếu được phép ghi tên, vì một số dự án phải ký NDA, không được tiết lộ thông tin ra ngoài), làm ở công ty nào, thời gian nàoMô tả ngắn gọn dự ánMan-days/months của dự ánTeam sizeVai trò của bạn trong dự ánNhững kỹ thuật bạn đã sử dụng trong dự án (programming language, frameworks, ….)Link đến những dự án đang chạy mà bạn đã làm (nếu có)

  • Bạn không cần ghi lý do rời khỏi công ty hay mức lương ở những vị trí trước đây, công ty sẽ hỏi bạn khi họ muốn biết

Education, Training, Soft-skills, Languages

  • Nên có, nhưng không có cũng không sao
  • Bạn chỉ nên đưa những bằng cấp phù hợp và có tính hỗ trợ cho công việc mà bạn sắp apply vào. Việc ghi quá nhiều bằng cấp hoặc bằng cấp quá cao có thể làm nhà tuyển dụng nghĩ bạn không phù hợp hoặc sẽ đòi lương cao hơn mức họ có thể trả, … nói chung là quá nhiều so với nhu cầu.
  • Chỉ liệt kê những soft-skills nào mà bạn thực sự có và phù hợp cho vị trí ứng tuyển
  • Quá nhiều bằng cấp hay chứng chỉ, khóa học soft-skills không liên quan hay hỗ trợ nhau, nhà tuyển dụng có thể đánh giá bạn rất ba phải hoặc không có định hướng hoặc là nổ.
  • Nếu bạn biết thêm ngôn ngữ nào khác ngoài tiếng Anh, hãy ghi vào và ghi cụ thể trình độ của bạn về ngôn ngữ đó

References/Achievements/Recommendation

  • Có thì tốt, không có cũng không sao. Công ty sẽ yêu cầu bạn cung cấp thông tin người tham khảo khi họ cần.
  • Nếu bạn có để thông tin người tham khảo, bạn nên xin phép hoặc báo trước với những người đó. Chỉ để thông tin kham khảo của cấp trên/đồng nghiệp/cấp dưới, những người có thể nhận xét bạn về công việc, đừng để vào đó nhưng người có quan hệ cá nhân.
  • Chỉ để những achievement/recommendations đáng tự hào nhưng liên quan tới công việc bạn muốn ứng tuyển.
  • Nếu có nhiều quá, hãy bỏ bớt và giữ lại 3 cái tốt nhất và liên quan gần nhất.

Tham khảo tin tuyển dụng Software Developer mới nhất trên TopDev

Trình bày CV như thế nào?

  • Format, font và màu chữ đồng bộ xuyên suốt CV. Chỉ nên dùng font Unicode (Time New Roman, Arial hoặc Tahoma), font size từ 10-12 tùy font và màu đen. Ở những chỗ như title hay tên mình, header thì nên dùng font lớn (cỡ 14-16) và in đậm/gạch chân để nổi bật hơn
  • Chú ý lỗi chính tả và độ chính xác thông tin,  đọc đi đọc lại nhiều lần
  • Nên save CV ở format *.doc, *.docx hoặc *.pdf, nhưng mình khuyến khích là *.doc hoặc *.docx. Vì sao? Vì dễ lưu trữ, tìm kiếm, chỉnh sửa và in ấn. Một số công ty còn dùng ATS (applicant tracker system) để quản lý CV, nghĩa là robot sẽ đọc CV của bạn. Bạn gửi CV bằng file MS Word thì recruiters sẽ rất cảm ơn bạn vì họ sẽ tiết kiệm được nhiều thời gian cho việc nhập liệu và dễ ghi chú

Nếu bạn cảm thấy quá phức tạp để ghi nhớ những lưu ý này thì công cụ tạo CV chuẩn tại ToDev sẽ giúp bạn, trải nghiệm ngay!

Tạo CV IT online, chuẩn ATS miễn phí trên TopDev

Bao lâu thì nên update CV 1 lần?

  • Đừng xem việc viết CV là 1 công việc nặng nhọc, hãy xem nó như là 1 công cụ ghi lại chi tiết sự nghiệp cũng như quá trình thăng tiến của mình.
  • Đừng dùng 1 bản CV duy nhất và gửi cho tất cả nhà tuyển dụng. Hãy viết 1 CV khác, lọc ra những kinh nhiệm, kỹ năng, khóa học, phần thưởng, recommendations… phù hợp nhất hoặc có thể support cho công việc mà bạn đang muốn apply vào. Như vậy sẽ làm cho nhà tuyển dụng thấy bạn phù hợp với công việc và cũng giúp CV của bạn sạch sẽ, dễ nhìn hơn.
  • Tốt nhất là bạn nên làm 1 CV có liệt kê đầy đủ thông tin nhất có thể, khi bạn có gì mới thì hãy update vào CV này. Mỗi khi bạn muốn apply vào công việc mới hay có recruiter kêu bạn gửi CV cho họ, bạn chỉ cần copy ra 1 bản khác và tốn 15 phút để delete những thông tin không phù hợp và gửi đi. Nhanh gọn lẹ!

Quảng bá CV của mình đến các recruiters

  • Bạn có nhu cầu xin việc, bạn gửi CV cho nhà tuyển dụng. OK!
  • Trường hợp bạn chưa muốn chuyển việc, nhưng luôn open cho những challenges mới hoặc dọn đường trước để lãnh lương tháng 13 xong rồi biến, hãy quảng bá CV của bạn đến các *job owners* tiềm năng. Hãy tạo profile của bạn trên mạng xã hội (linkedin), cố gắng tạo nhiều connections trong lĩnh vực mà bạn quan tâm, hãy connect với nhân viên tuyển dụng của công ty, HRM, headhunters, CTO hay CEO của công ty, dev ở những cty khác, …những network  này sẽ giúp bạn rất nhiều cả khi bạn chủ động tìm việc hoặc được *săn* bởi các công ty săn đầu người.
  • Tuy nhiên, public thông tin cá nhân lên internet đồng nghĩa với việc bạn sẽ bị spam của bạn gia tăng, bằng cách này hay cách khác

Chú ý khi nộp hồ sơ qua email

  • Thành thật mà nói mình không thích các bạn đến gặp trực tiếp để đưa hồ sơ ứng tuyển (trừ khi được yêu cầu), mình thích nhận hồ sơ online qua email hơn. Lý do thì có rất nhiều, nhưng đại khai là vấn đề về nhập liệu, lưu trữ, tìm kiếm và quản lý. Đó là chưa kể đến việc khi bạn đến công ty mà không thông báo trước, nhiều lúc đang lười mà cũng phải ra tiếp, rất bực.
  • Khi nộp hồ sơ qua email, bạn có thể gọi điện hoặc chat với recruiter để báo, phòng trường hợp email của bạn rơi vào spam box. Tuy nhiên, cũng có 1 vài recruiters không thích việc nhắc này.
  • Tiêu đề email: Tên mình và vị trí mình muốn apply (để tiện việc search emails cũ). Nếu công ty có yêu cầu cụ thể về cách viết tiêu đề thì hãy làm theo yêu cầu của họ.
  • Viết cover letter, tức là khi bạn gửi email để ứng tuyển vào vị trí nào đó, thì ngoài cái attachment là CV ra, thì bạn nên viết vài dòng cho nhà tuyển dụng trong email, tránh việc để cái email không có chữ nào. Cá nhân mình thì không cầu kỳ về cái letter này, vì mình cũng hiểu là nhiều bạn cũng muốn viết cho hay, nhưng mà không biết viết cái gì. Vì vậy, khi viết cover letter bạn nên có những thông tin tối thiểu như sau:

Title of email: Le Van Teo – apply to Senior PHP Developer position

Attachment: yes (dưới 500kb là đẹp)

————————————

Dear Mr Lê Minh Khuyến,

I’m Lê Văn Tèo, a 5 years experience PHP Dev. I would like to apply to the position of Senior PHP Developer (http://www.link-to-the-job-posted )

Attachment is my CV and I can be reached via mobile phone number: 01234567890

Thank you

Lê Văn Tèo

Các bạn lưu ý một số lỗi hay gặp mà có thể làm cho recruiter ghét ngay ở khi chưa kịp gặp:

  • Viết ngôn ngữ teen hoặc viết tắt nhiều quá, đọc vào không hiểu là viết cái gì
  • Dear sai tên người, sai tên cty, sai thông tin (thường là do rải CV nhiều cty cùng lúc, lười hoặc bất cẩn khi update)
  • Apply cùng lúc nhiều cty, nhưng bỏ tất cả vào *To* mà không biết dấu vào *Bcc*
  • Không ghi rõ vị trí muốn apply
  • Gửi email không có tiêu đề, nội dung
  • Nội dung email xài nhiều font và màu chữ khác nhau (thường là do rải CV nhiều cty cùng lúc, lười hoặc bất cẩn khi update)
  • Gửi CV ở định dạng *.png hay *.jpg (rất bất tiện để lưu trữ, tìm kiếm và ghi chú)
  • Bỏ CV trong file nén (không cần thiết)
  • CV màu mè, nhiều hình ảnh, download rất lâu, nhiều khi xài iPad download tốn tiền 3G
  • Gửi quá nhiều hình hay files làm attachment rất nặng (thường đính kèm bản điểm, bằng cấp khi chưa được yêu cầu)
  • Gửi nhiều file nhưng không rename file, nhìn vào không biết là file gì
  • Ghi cover letter dài dòng và nổ quá nhiều
  • Địa chỉ email quá nhố nhăng. Ví dụ email nhưng hungphpcoder@….com hay myfirstjavaclass@….com.vn thì còn tạm chấp nhận được. Nhưng nhiều bạn còn sử dụng địa chỉ email nhưboyxitin@…com hay tommydispacy@….com, nếu gặp recruiters khó tính họ có thể delete luôn email của bạn

CV mẫu:

  • Rất nhiều mẫu CV đẹp dành riêng các bạn lập trình viên tại đây. Công cụ tạo CV online miễn phí cho phép bạn tạo CV cực nhanh trong 5 phút theo chuẩn ngon lành.
  • Có rất nhiều mẫu trên internet, các bạn cứ tìm, download về và chỉnh sửa theo ý muốn
  • Nội dung vẫn quan trọng hơn layout, nhưng mà cũng đừng có xấu hay màu mè quá
  • Một số công ty outsourcing lớn như Harvey Nash hay Axon Active có mẫu profile (CV) cho nhân viên của họ, dùng để show hàng với clients về khả năng của team khi kiếm project hay đại loại vậy, mình cũng không rành. Các bạn cố gắng kiếm 1 cái về coi thử. Theo kinh nghiệm của mình thì những mẫu đó rất rất rất tốt cho 1 developer, ngoại trừ nó rất là dài dòng do liệt kê nhiều projects
  • Hãy tự tin khi viết CV và cover letter, nhưng mà đừng nổ nhiều quá hay nói xạo nhà tuyển dụng.
via Review Company

Laravel, bạn đã viết đúng?

Chào các bạn trong bài trước mình đã chia sẽ cho các bạn những lời khuyên để học nhanh Laravel rồi phải không nào.

Qua nhiều lần khảo sát cũng như trao đổi với nhiều bạn làm về Laravel mình nhận thấy đa phần các bạn đều viết sai cách. Sai ở đây mình không nói về Logic mà mình nói về cách viết trong OOP (Hướng đối tượng).

Hôm nay mình viết bài này để chia sẽ cho các bạn code Laravel sao cho đúng (ý kiến cá nhân mình ^^) nhằm tăng performance website cũng như tính thẳm mỹ trong code.

Nói đến hướng đối tượng thì không riêng gì Laravel mà các Framework cung như thế. MVC là gì mình không cần phải nói ai cũng biết phải không nào ?. Nhưng liệu chúng ta có hiểu được mỗi thành phần trong đó xử lý những gì không nào. Đây là cái mình sẽ nói chính trong bài viết này.

1. Sử Dụng MVC theo đúng nghĩa !

Qua nhiều lần trao đổi với nhiều bạn. đa phần các bạn viết sai công dụng của các thành trên. Controller nhiều bạn gọi Models và viết cả câu query để truy vấn dữ liệu như vậy là sai nhé các bạn. viết như thế sẽ không còn mô hình MVC nữa nhé.

Vậy viết sao cho đúng nghĩa MVC ?
Với Models chúng ta nên viết function xử lý trong chính Class bạn muốn lấy dử liệu. Sau khi có fucntion mong muốn Controller chỉ cần đều hướng tới Models gọi function can thiết và trả về dữ liệu. Các bạn hãy xem qua ví dụ sau.

//Models
 
Class User extends Model
{
     protected $table = 'users';
 
 
     public function getListUser()
     {
        return self::get();
     }
}
 
//Controllers
 
use App\User;
 
Class UserController extends Controller
{
    function __construct(User $user)
    {
        $this->user = $user;
    }
 
    public function index()
    {
        $listUser = $this->user->getListUser();
        return view('viewName', compact('listUser'));
    }
}

Khá là đơn giản phải không nào. Trong ví vụ trên tôi có dùng __construct trong việc khởi tạo models. Nhiều bạn vẫn thường dùng New ModelClass đều này không sai nhưng việc cứ lặp đi lặp lại mỗi function bạn phải gọi new Model nhin code không đẹp cho lắm. Thì __construct sẽ giúp các bạn trong việc này.

Qua ví vụ trên các bạn thấy code có ngắn gọn hơn không nếu code bạn cũng đang mắt phải tình trạng mình vừa nói thì hãy thử theo cách của mình nhé.

2. Request hãy để nó làm việc theo đúng những gì nó có !

Cũng như Models. Request sẽ quản lý các xữ lý liên quan gữi và nhận yêu cầu từ phía người dùng (Views). Nhiều bạn vẫn dùng nó ngay tại controller đều này không sai. những nó sẽ dẫn tới việc lặp đi lặp lại làm cho function chức năng của chúng ta như một mớ hỗn độn khó mà quản lý.

Cách giải quyết hợp lý nhất là ta nên xây dựng một nơi để quản lý vấn đề này bằng cách tạo một Request riêng. Với Laravel chúng đã tích hợp sẵn lệnh tạo một Request thông qua Artisan Console các bạn có thể thực hiện như sau:

php artisan make:request ten_request

 

Đây là nội dung Request ta vừa tạo. Tôi đã tạo một file Request có tên là UserRequest:
//app/Http/Requests/UserRequest;
 
namespace App\Http\Requests;
 
use App\Http\Requests\Request;
 
class UserRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }
 
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

Chúng ta sẽ làm gì với nó. Nhiều bạn chua sử dụng qua chắc chắn sẽ bối rối phải không nào. tại đây chúng ta sẽ xử lý Validate input từ form được gửi lên từ người dùng. mà những Rules validate này đã có sẳn trong Laravel Doc. Các bạn có thể xem qua ví vụ sau:

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'username' => 'required'
    ];
}

Khá quen thuộc phải không nào. Không dừng ở đó tại đây các bạn có thể custom được cả thuộc tính Attribute của input và custom được message sẽ hiện thị khi bắt lỗi

/**
 * Get the validation attributes that apply to the request.
 *
 * @return array
 */
public function attributes()
{
    return [
        'username' => 'Tên người dùng'
    ];
}
/**
 * Get the validation custom message that apply to the request.
 *
 * @return array
 */
public function customMessages()
{
    return [
        'username.required' => 'Tên người dùng bắt buộc nhập',
    ];
}

Vậy sử dụng Request này như thế nào. Đơn giản thôi tại controller ban muốn sử dụng các bạn hãy gọi NameSpace của nó ra để khái báo rằng bạn sẽ sử dụng nó.

use App\Http\Requests\UserRequest;
 
Class UserController extends Controller
{
    //
}

Tiếp theo chúng ta cần làm gì. Truyền tham chiếu nó vào action bạn cần xử lý Request. Ví vụ tôi có action đăng ký người dùng như sau:

use App\Http\Requests\UserRequest;
 
Class UserController extends Controller
{
    //
 
    public function userRegister(UserRequest $request)
    {
        // your code here.
    }
}

Ở function userRegister các bạn sẽ không cần phải gọi Validator rồi make rules các kiểu nữa vì UserRequest đã thay bạn làm cả rồi.^^

3. Tạo Helper hãy vận dụng OOP thông qua Namespace

Nhiều bạn mắc lỗi nho nhỏ khi tạo thư viên helper cua mình nhằm giúp xử lý các tác vụ nhỏ khi cần thiết nhu xử lý chuỗi, mảng ,…Mọi người thường xử lý theo dạng php thuần trong khi các bạn đang viết OOP.

funtion getString($string)
{
    return $string;
}

 

Đây cũng là một cách. nhưng thật sự không tối ưu khi chỉnh sửa và thường gặp lổi với autoload khi các bạn thêm vào composer.jon autoload. ý kiến cá nhân của mình các bạn nên tận dụng cái mà OOP đang làm cách mà Laravel đang sử dụng. mọi thứ đều viết với dạng các lớp , thuộc tính và phương thức.
namespace App\Helpers;
class Helper
{
    public function getString($string)
    {
        return $string
    }
}

 

Việc sử dụng cũng khá dẽ dàng các bạn chỉ cần khai báo namespace tại controller và gọi phương thức của nó ra.
use App\Helpers\Helper;
 
Class UserController extends Controller
{
    function __construct(Helper $helper)
    {
        $this->helper = $helper;
    }
 
    public function userRegister(UserRequest $request)
    {
        $this->helper->getString($string);
    // your code here.
    }
}

Lời kết:

trên chỉ là ý kiến cá nhân của mình. mọi góp ý các bạn có thể comment bên dưới. Hy vọng bài viết giúp ích cho các bạn trong việc học tập cũng như rèn luyện code của mình.

Còn khá nhiều thủ thuật khác mình sẽ đề cập trong bài viết tiếp theo nhé!. Chúc các bạn thành công. Nếu thấy bổ ích các bạn hãy share cho bạn bè nhé.

Tham khảo thêm các vị trí tuyển dụng Laravel lương cao cho bạn.

Nguồn: Techtalk via codevivu

Người ta không rời bỏ công ty- họ từ bỏ những người lãnh đạo

Tôi đã tuyển dụng hàng ngàn người trong những năm qua. Và mỗi khi nhận được đơn xin nghỉ việc, một phần trong tôi dường như đã chết (đồng ý, tôi nói dối. Tôi đã thậm chí nhảy múa ăn mừng trong một vài trường hợp nhưng đó là trong một bài viết khác).

Phần lớn, phản ứng tức thời của tôi rất bản năng là tôi tự hỏi: lý do thật sự khiến cho họ làm điều đó? Có chuyện gì xảy ra với họ? hay thậm chí: cô ấy phải ra đi vì tiền. Thật ngốc nghếch!

Nhưng tôi đã khôn dần lên theo sự nhiều lên của năm tháng.

Phần lớn, mọi người không thay đổi công việc vì tiền. Họ cũng không xin nghỉ vì thích hay trong cơn nóng giận. Họ vào làm việc ở công ty của bạn bởi vì họ tin là họ thích hợp và ai cũng muốn quyết định đó đúng đắn. Đôi khi, tại một số thời điểm, có những điều khiến cho điều đó trở thành sai. Và nếu như bạn thực sự dành thời gian để “đào sâu” tìm hiểu lý do mà họ để lại – thực ra là bạn phải làm điều đó – thì bạn sẽ nhận ra rằng đó hoàn toàn không phải là “vì công ty” như họ đã nói. Đó không phải vì địa điểm làm việc, vì nhóm, vì hệ thống hay vì không khí làm việc.

Đó là vì người lãnh đạo!

Chắc chắn những người ấy không nói như thế. Và bạn chẳng thể tìm thấy được một từ đề cập đến vấn đề quản lý ở đây.

Nhưng khi họ nói về “tinh thần”, khi họ nói về “giao tiếp nghèo nàn”, khi họ bày tỏ sự thất vọng ở sự mập mờ, thiếu rõ ràng trong con đường thăng tiến, chính là họ đang đề cập đến những người lãnh đạo. Muốn rõ ràng hơn? Lãnh đạo là người có trách nhiệm trong việc gây dựng tinh thần – giao tiếp và con đường sự nghiệp của nhân viên.

Có lẽ vì thế mà tôi đã rất bực mình với những nhân sự cấp cao và ngăn họ lại giữa chừng – khi họ bắt đầu dùng những từ như ngu ngốc, vô ơn và dối trá để nói về những người nghỉ việc.

“Công ty” chỉ là một thực thể pháp lý. “Kinh doanh” chỉ là một bộ sưu tập bàn làm việc và máy tính. Không ai nghỉ việc vì những thứ đó.

Đó là quyết định, là động lực, là không khí làm việc, là sự hỗ trợ, đào tạo, tậm nhìn và sự chỉ đạo được xuất phát từ chính những người lãnh đạo mà họ đi theo.

Vì thế, lần sau khi bạn nhận được đơn xin nghỉ việc của nhân viên, hãy cố gắng đừng phấn khích và cười nhạo những người ra đi vì: đã thêm một kẻ ngu ngốc không thuộc về nơi này.

Hãy dùng ít phút để ngẫm nghĩ về lý do thực sự khiến họ ra đi.

Họ không từ bỏ những thứ họ không có được – cũng không phải từ bỏ công ty.

Họ từ bỏ bạn!

– dịch từ Poeple don’t leave companies. They leave leaders của Greg Savage

Nguồn: KIEN THUC KINH TE

Chọn sếp, đừng chọn việc!

Chọn sếp, đừng chọn việc!

Đừng chỉ chọn công việc. Hãy chọn sếp. Người sếp đầu tiên sẽ là nhân tố có ảnh hưởng lớn tới thành công sự nghiệp của bạn. Sếp không tin tưởng vào bạn sẽ không cho bạn cho cơ hội phát triển.

Trên đây là lời khuyên của tiến sĩ William Raduchel – một đạo diễn, nhà đầu tư và chuyên gia tư vấn chiến lược. Ông từng là giáo sư kinh tế tại đại học Havard, từng điều hành AOL Time Warner, Xerox, McGraw-Hill và nhiều doanh nghiệp khác. Lời khuyên của ông đã khiến rất nhiều người tìm việc (và cả những người đang có việc làm) phải suy nghĩ lại về lý do chọn lựa nơi làm việc của mình và những điều thực sự ảnh hưởng tới thành công sự nghiệp của họ.

Việc này nghe có vẻ khó khăn bởi quy trình tìm việc truyền thống lại diễn ra theo hướng ngược lại: sếp chọn bạn chứ không phải bạn chọn sếp. Thông báo tìm việc không hề đưa ra những chỉ số như “mức độ khó chịu của sếp” hay bất cứ con số nào liên quan. Thường thì bạn chỉ có thể nói chuyện với sếp thông qua buổi phỏng vấn xin việc và quãng thời gian ít ỏi này dường như cũng khó mà giúp bạn đưa ra phán đoán chính xác về con người sếp. Thế nhưng bằng cách tập trung vào sếp, thay vì những tiêu chí đánh giá thông thường khác (như địa điểm làm việc, mức lương, trách nhiệm công việc, cơ hội thăng tiến…) con đường theo đuổi sự nghiệp của bạn sẽ thay đổi và bạn sẽ hạnh phúc khi nhận ra mình chọn đúng người. Không chỉ công việc mà lựa chọn sếp cũng có tầm quan trọng nhiều hơn bạn nghĩ, bởi:

  • Một vị sếp tốt trong 1 công ty bình thường có thể bảo vệ và hỗ trợ bạn.
  • Một vị sếp tồi trong 1 công ty tốt sẽ khiến bạn phát điên và còn hủy hoại bạn.
  • Một vị sếp tốt trong 1 công ty tốt sẽ mở khóa mọi tiềm năng mà bạn có.

Tham khảo các nhà tuyển dụng IT chất lượng tại Topdev

Trong trường hợp đầu tiên, bạn sẽ học hỏi được nhiều hơn và có thể cũng có nhiều cơ hội hơn về sau. Một vị sếp tốt có thể nhận ra tài năng của bạn và phát triển chúng nhưng một vị sếp tồi sẽ chẳng bao giờ nhận ra những gì bạn có thể làm hay trao cơ hội để bạn tự phát triển mình. Lợi ích duy nhất khi làm việc cho 1 vị sếp tồi trong 1 công ty tốt (trường hợp thứ 2) đó là bởi làm việc cho công ty này là cách duy nhất để bạn chuyển sang 1 nơi khác, làm việc với những con người khác, 1 vị sếp khác và đạt được những thành tích tốt nhất cho cả bạn và công ty. Hầu hết mọi người chọn việc vì những lý do như:

  • Mức lương – điều này quan trọng nhưng nó có thể là 1 cái bẫy. Nhiều người kiếm lương ngàn đô nhưng ghét công việc của mình và từ đó, ghét cả cuộc sống của mình. Họ làm việc cùng những đồng nghiệp có thể cũng là những người bị thu hút bởi tiền lương. Nếu nghĩ dài hạn hoặc muốn phát triển sự nghiệp, đừng bao giờ chọn lương là tiêu chí chủ yếu của mình. Đó là phương pháp đánh giá lười biếng nhất và do đó cũng là yếu kém nhất.
  • Công việc cụ thể – nhiều người bị hấp dẫn bởi 1 số dự án, công việc hay vai trò cụ thể. Rồi bạn sẽ nhận ra rằng những dự án “hot” không chắc đã mang lại môi trường làm việc năng suất hay vui vẻ. Trong khi làm những công việc này (và ngay cả khi học hỏi được điều gì đó) sự nghiệp dài hạn của bạn lại phải nhận hậu quả. Có rất nhiều người có tầm nhìn dài hạn, chấp nhận làm việc với những người quản lý tốt hơn là chọn những dự án “hot”, nhờ đó mà họ có thể thăng tiến như cách mà sếp của họ đã làm.
  • Chức vụ nghề nghiệp – ngay cả khi bạn phải làm việc như 1 thực tập sinh, nếu bạn có tài năng và làm việc chăm chỉ thì 1 người sếp tốt cũng sẽ nhận ra khả năng của bạn và đưa bạn lên vị trí xứng đáng hơn. Ngay cả khi không có vị trí nào khuyết cho bạn, một người sếp tốt cũng sẽ có một mạng lưới quan hệ rộng lớn và giúp đặt bạn ở đúng nơi bạn nên ở. Một người sếp giỏi sẽ biết ai nên làm việc ở đâu. Theo đuổi những chức vụ nghề nghiệp và bỏ mất 1 vị sếp tốt có thể là 1 cái bẫy cho bạn, họ sẽ không bao giờ cho bạn rời vị trí đó cho dù bạn có phát triển ra sao.

Lựa chọn được 1 vị sếp tốt cũng đòi hỏi phải có mạng lưới quan hệ rộng lớn. Bạn cần hỏi bạn bè trong ngành xem có sếp nào như bạn cần. Việc này có thể mất thời gian nghiên cứu và tìm kiếm thông tin nhưng biết được ai trong ngành là 1 vị sếp tốt và theo đuổi họ thì bạn sẽ có được tài sản quý giá nhất cho sự nghiệp lâu dài của mình. Nếu đã nghĩ tới 1 hay 2 công ty thì hãy thử tìm hiểu xem có vị sếp nào thuộc chức năng công việc của bạn hay không.

Càng ít kinh nghiệm thì bạn càng khó chọn sếp nhưng điều này cũng không sao. Hãy tìm hiểu về mức độ luân chuyển nội bộ trong công ty xem mọi người có thường xuyên chuyển vị trí làm việc, hay có luân chuyển nhân sự giữa các nhóm hay không. Nếu có thì sau khi được nhận công việc, mục tiêu của bạn là đặt ra những việc cần làm để có được cơ hội làm việc với sếp mà mình muốn.

Nguồn: Applancer Careers

Đâu là hướng đi tốt nhất để tạo 1 Messenger Bot?

Đâu là hướng đi tốt nhất để tạo 1 Messenger Bot
Đã hơn 1 năm kể từ khi Facebook chính thức cho ra mắt Chatbot API trên Messenger, tạo ra một bước phát triển mới. Sau một thời gian tìm hiểu, các lập trình viên đã cùng nhau đặt ra một câu hỏi “Đâu là hướng đi tốt nhất để tạo 1 Messenger Bot?”Và dưới đây là một vài câu trả lời được xem là đáng giá nhất được ghi nhận lại trên Quora:

User Kubra Zengin – Product Development

“Bằng cách Iterating! Iterating! Iterating! Cách duy nhất để có bot tuyệt vời, bạn cần phải lặp lại bot dựa trên các số liệu và dữ liệu.

Dưới đây là một số bước sau:

  1. Ý tưởng bot – Giai đoạn nghiên cứu

Giai đoạn ý tưởng là cuộc thảo luận bao gồm khám phá những ý tưởng làm thế nào để giải quyết vấn đề trên bot của bạn. Các bot makers có thể tiến hành nghiên cứu với các đối tượng mục tiêu dựa trên tiêu chí, cuộc phỏng vấn với các bên liên quan, chạy thử nghiệm ý tưởng trong bối cảnh của chương trình của họ.

2. Sáng tạo bot – Giai đoạn xây dựng

Giai đoạn sáng tạo là phần phác thảo các thiết kế. Dựa trên danh sách tính cách bot của bạn, cải thiện các giải pháp và nhận được nền tảng vững chắc của bot.

3. Thử nghiệm bot – Giai đoạn học tập

Sau khi khởi động các bot, giai đoạn học tập được bắt đầu. Các kết quả thu thập dữ liệu rất quan trọng để tạo ra các mô hình có ý nghĩa. Sau khi tạo mẫu thử nghiệm MVP, giai đoạn này có thể thực hiện sau khi thu thập cả dữ liệu phân tích và dữ liệu nghiên cứu. Bạn có thể dùng Botanalytics | Conversational Analytics cho đầu ra dữ liệu của bạn.

4. Iterating – Giai đoạn nâng cao

Đây là giai đoạn cuối cùng cho bot của bạn. Tất cả các bước trên được dùng cho giai đoạn nâng cao này. Đây là giai đoạn thể hiện tất cả khả năng ra bên ngoài và xây dựng dữ liệu dựa trên quan điểm nhanh và nhạy. Thêm giải pháp sáng tạo vào từng bước. Cuối cùng, tất cả mọi thứ sẽ giải quyết được vấn đề của người dùng và tạo nên một cuộc hội thoại thú vi.

Tham khảo thêm các vị trí tuyển dụng IT lương cao tại đây

User Keyu – Chatbots Developer

“Phát triển chương trình cho Facebook Messenger hay bất kì nền tảng Messenger nào khác có 3 bước chính”

1. Thiết kế

Suy nghĩ về các hội thoại khác nhau trong cuộc nói chuyện của người dùng với bot của bạn. Bạn cần xác định điều gì sẽ xảy ra với người dùng. Bạn phải xác định dòng chảy và từ khoá của hội thoại và trả lời chúng bằng bot của bạn. Đây là bước định hình cho bot của bạn.

2. Phát triển

Sau khi quyết định dòng chảy và từ khoá, chúng ta sẽ bắt đầu phát triển các bot. Có rất nhiều nền tảng phát triển hỗ trợ bạn trong việc này. Trong một số nền tảng này, bạn không cần biết code và có thể xây dựng chat bot một cách nhanh chóng. Và trong một số nền tảng khác, bạn phải code và kiến thức kỹ thuật. Dựa trên nhu cầu sử dụng của bạn mà sẽ đưa ra được cách tiếp cận tốt nhất để xây dựng bot.

3. Làm bot thông minh hơn

Khi bạn đã phát triển bot và bắt đầu nói chuyện với người dùng, bạn có thể làm cho bot của mình dễ hiểu và thông minh bằng cách tích hợp công cụ NLU/NLP với bot của bạn. Nhiều công ty đang cung cấp các công cụ miễn phí, hãy sử dụng chúng.

4. Giữ lại người dùng

Sau khi tung ra chatbot của bạn, sử dụng công cụ Analytics để biết thêm về cuộc nói chuyện thông thường giữa người dùng và bot, tính năng hữu ích nhất trong bot của bạn, lưu lượng bot và sử dụng thông báo đẩy để cập nhật thông tin và giữ người dùng của bạn.

Tip cho bạn: Publish bot của bạn trên nhiều stores khác nhau để tiếp cận được nhiều khách hàng hơn.”

Kỹ năng xây dựng thương hiệu cho người bắt đầu tìm việc

Kỹ năng xây dựng thương hiệu cho người bắt đầu tìm việc

Đây là bài thứ 2 trong loạt bài kỹ năng của Huyền Chip. Mình dành rất nhiều thời gian và công sức viết loạt bài này vì mình tin rằng những kỹ năng này là thực sự cần thiết cho các bạn trẻ. Mình hy vọng các bạn chịu khó dành thời gian đọc.

Hôm nay mình tham gia một buổi hội thảo về việc tuyển dụng ở các công ty lớn. Các quản lý thừa nhận rằng mỗi khi nhận được hồ sơ ứng tuyển, họ sẽ kiểm tra thương hiệu của người này bằng hai cách. Thứ nhất là tìm kiếm thông tin về người đó trên mạng. Thứ hai là hỏi trực tiếp những người biết ứng cử viên này. Thông tin trên mạng và những gì những người xung quanh nói về bạn tạo nên thương hiệu cá nhân của bạn. Thương hiệu cá nhân tốt hay xấu nhiều khi trở thành yếu tố quyết định để bạn có được cuộc phỏng vấn cho công việc mơ ước hay không.

Mỗi khi nói chuyện với các bạn trẻ Việt Nam, mình thấy ngạc nhiên là rất nhiều bạn than thở tìm việc vất vả thế này thế kia nhưng lại rất thờ ơ với việc xây dựng thương hiệu cá nhân. Résumé của họ rất lem nhem, thậm chí nhiều người còn không có résumé. Họ không có sự hiện diện chuyên nghiệp nào trên mạng — gõ tên của họ lên mạng sẽ chỉ thấy một số bức ảnh kỳ cục trên Facebook hay một số lời bình phẩm nhăng nhít trên các diễn đàn, hoặc không có gì. Nếu hỏi có ai có thể nói tốt đẹp về năng lực của họ — không có ai. Là người tham gia vào thị trường lao động, bạn không cần xây dựng thương hiệu đến mức nổi tiếng, nhưng bạn sẽ cần có thương hiệu đủ tốt để người mua hàng (nhà tuyển dụng) chú ý đến bạn.

Mình may mắn là ý thức về thương hiệu cá nhân từ rất sớm. Mình biết, thương hiệu cá nhân của mình tốt hay xấu là một điều gây tranh cãi. Nhưng từ khía cạnh công việc, thương hiệu cá nhân của mình khá thành công. Mình từ quê lên Hà Nội học cấp 3, không quen biết ai, trong ba năm học cấp 3 ấy, mình đã xây dựng thương hiệu cá nhân đủ để được nhận vào nhiều công ty lớn như Báo Mới (nay thuộc VNG), VCCorp, Cốc Cốc.

Khi sang Mỹ, mình đã phải xây dựng thương hiệu cá nhân lại từ đầu. Sau ba năm, mình đã có thương hiệu cá nhân đủ để thường xuyên nhận được lời mời phỏng vấn từ các công ty lớn như Google, Facebook, Netflix cũng như nhiều công ty khởi nghiệp. Hiện tại, mình làm nghiên cứu trí tuệ nhân tạo ở Netflix.

Quá trình xây dựng thương hiệu cá nhân suốt 10 năm qua đã dạy cho mình rất nhiều điều. Hôm nay, mình muốn chia sẻ những kinh nghiệm mình thu thập được với các bạn.

1. Viết một résumé chuyên nghiệp

Một trong những thứ đầu tiên nhà tuyển dụng nhìn thấy là résumé. Có một résumé chuyên nghiệp, hay ít nhất là không phản cảm, là vô cùng quan trọng.

Ngày trước ở Việt Nam, mình hay nhầm lẫn résumé với CV. Résumé là bản tóm tắt kinh nghiệm, quá trình học tập, năng lực bản thân. Résumé thường chỉ dài một đến hai trang, nhưng mình thực sự tha thiết mong các bạn chỉ nên giữ résumé của mình ở một trang thôi. Đến cả những thường thành công với ti tỉ công việc như Elon Musk cũng vẫn có thể giữ résumé ở mức một trang nữa là dân đen như mình.

CV là viết tắt của curriculum vitae, cụm từ tiếng Latin dịch nôm na là quá trình sống. CV có thể bao gồm tất tần tật chi tiết những kinh nghiệm học tập, làm việc, thành tích của bạn.

Các công ty tuyển dụng thường sẽ muốn xem résumé của bạn vì không ai có thời gian đọc CV dài ngoằng. Bản thân mình thì chưa bao giờ viết CV, cũng chưa có công ty nào từng hỏi mình gửi CV. Nhưng mình thấy các giáo sư của mình thường có CV liệt kê dài ngoằng những bài báo khoa học họ đã đăng cũng như những giải thưởng của họ.

Khả năng viết một résumé súc tích, dễ hiểu phản ánh năng lực làm việc của bạn. Có nhiều để viết résumé, nhưng nó thường sẽ bao gồm những phần sau:

  • Mục đích: Bạn đang tìm gì — công việc toàn thời gian, bán thời gian, thực tập — trong ngành gì, vào khoảng thời gian nào.
  • Thông tin liên lạc: số điện thoại, email, trang web cá nhân (nếu có, và mình khuyên các bạn nên có) hoặc nơi mà nhà tuyển dụng có thể tìm hiểu thêm thông tin về sự nghiệp của bạn.
  • Thông tin giáo dục: ngành nghề, trường học, năm tốt nghiệp. Nếu điểm phẩy của bạn cao thì đưa vào. Nhưng thường thì nếu bạn đã đi làm một thời gian thì chẳng ai quan tâm đến điểm phẩy của bạn cả.
  • Kinh nghiệm làm việc: Khoảng 3 – 6 kinh nghiệm làm việc trước đây của bạn. Nó có thể là vị trí quản lý trong một câu lạc bộ sinh viên, kinh nghiệm thực tập, tổ chức sự kiện. Để có thêm chi tiết, bạn có thể đọc phần Làm những điều giúp ích cho résumé của bạn.
  • Dự án cá nhân: Những dự án mà bạn làm trong thời gian rảnh rỗi. Nó thể hiện niềm đam mê và tinh thần khởi xướng dẫn đầu của bạn. Bạn có thể đọc phần Làm những điều giúp cho ích résumé của bạn để biết thêm chi tiết.
  • Giải thưởng (nếu có): Nó có thể bao gồm thành tích học tập, công tác, hay giải thưởng các cuộc thi, hackathon.
  • Các môn học liên quan (tuỳ trường hợp): Nếu bạn có ít kinh nghiệm liên quan đến công việc bạn đang ứng tuyển, bạn có thể liệt kê những môn học giúp ích cho công việc mà bạn đã học.
  • Kỹ năng và sở thích: Bạn có thể liệt kê những kỹ năng mình có, ví dụ nếu là lập trình viên, bạn có thể liệt kê những ngôn ngữ lập trình bạn thành thạo, những framework bạn quen thuộc, hay nếu bạn làm marketing thì có thể liệt kê những công cụ marketing bạn dùng như A/B testing, Google Analytics.
  • References: Danh sách hai người có thể chứng thực cho năng lực làm việc của bạn.

Đây là link đến résumé cũ của mình để mọi người có thể tham khảo. Mình sẽ phân tích một số điểm ở résumé của mình để các bạn có thể áp dụng vào résumé của các bạn.

Mình không có phần mục đích vì đây là résumé chung chung đưa lên làm hàng, chứ mình chưa dùng nó để nộp đơn vào đâu.

Trong phần giáo dục, mình chỉ đưa thông tin bằng đại học và thạc sĩ của mình mà không đưa thông tin cấp 3 vì hai lý do. Thứ nhất, mình nghĩ đại học và thạc sĩ là đủ rồi. Thứ hai, chả ai ở Mỹ quan tâm đến một trường cấp 3 ở Việt Nam cả. Nếu bạn là sinh viên đại học ở Việt Nam và theo học một trường cấp 3 tốt tốt một tí, thì bạn có thể đưa thông tin về trường cấp 3 của bạn vào.

Phần kinh nghiệm làm việc của mình có đến 7 vị trí. Mình thấy nó hơi dài, nên mình đang tính sẽ bỏ bớt đi một kinh nghiệm. Bạn đọc bài này nếu có lời khuyên nên bỏ kinh nghiệm nào, xin hãy comment ở dưới. Mình tò mò muốn biết kinh nghiệm nào các bạn coi là quan trọng, cái nào là không quan trọng.

Mình vẫn còn phần Relevant Coursework, những môn học liên quan, vì mình có nó từ hồi làm résumé năm đầu. Mình đang nghĩ vì phần kinh nghiệm của mình đã khá dài, mình sẽ bỏ phần này đi.

Mình không có phần references vì khi gửi résumé, mình hoặc sẽ gửi kèm references trong cover letter, hoặc bảo là sẽ gửi references nếu người tuyển dụng quan tâm.

2. Làm những điều giúp ích cho résumé của bạn

Một điều mình hay nghe bạn bè mình nói bên này là: “Mặc dù tao không thích nó lắm nhưng nó sẽ rất tốt cho résumé của tao” hay “Công việc này không trả tiền nhưng nó sẽ rất tốt cho résumé của tao.” Sẽ thật tuyệt vời nếu những điều bạn thích làm cũng sẽ trả bạn nhiều tiền lại giúp ích cho résumé của bạn, nhưng không phải lúc nào cuộc sống cũng hoàn hảo như thế. Khi mình còn trẻ, chưa có nhiều cái để khoe trên résumé, mình sẽ phải chịu khó làm những việc mình không thích, hay làm không công.

2a. Tham gia các câu lạc bộ sinh viên

Một cách dễ dàng để sinh viên có kinh nghiệm cho vào résumé là tham gia các câu lạc bộ sinh viên, trong hoặc ngoài trường. Câu lạc bộ là gì thực sự không quan trọng. Bạn có thể tham gia câu lạc bộ khởi nghiệp, marketing, tranh biện, thám hiểm vũ trụ, lập trình, thậm chí hiphop, trà đạo, tung hứng, bất cứ cái gì mà bạn thích. Nếu không tìm được câu lạc bộ bạn yêu thích, hãy thành lập câu lạc bộ của chính bạn. Ở Việt Nam mình có quá trời cơ hội để thành lập câu lạc bộ, có lợi không chỉ cho bản thân bạn mà còn cho những người quan tâm đến chủ đề đấy. Hồi học cấp 3, mình thành lập Free Hugs Vietnam — tổ chức ôm tự do! Mọi người cứ nghĩ ôm ấp linh tinh thì ích lợi gì cho công việc, nhưng tổ chức này đã dạy cho mình rất nhiều kỹ năng: tuyển thành viên, duy trì thành viên, tổ chức sự kiện, quảng bá sự kiện, xin tài trợ, … Với Free Hugs Vietnam, mình nộp đơn tham gia một hội thảo ở Malaysia, được tài trợ sang đấy, gây ấn tượng với một diễn giả, và ông mời mình sang đó làm việc khi mình mới học xong cấp 3. Anh chàng Jaime trong cuốn sách về Stanford của mình nhận được lời mời nói chuyện ở NASA và vô số công ty khác là nhờ sự tham gia của anh chàng trong câu lạc bộ thám hiểm vũ trụ.

Trong câu lạc bộ, bạn cần thể hiện năng lực lãnh đạo. Bạn có thể tham gia vào ví trí quản lý, đề xuất phương hướng hoạt động, tổ chức sự kiện, tham gia thi đấu. Nếu sự kiện bạn tổ chức có đến vài trăm người tham gia hay bạn thắng giải gì đó thì càng tốt. Nhưng bạn đừng tham lam làm ba bốn câu lạc bộ một lúc. Khi đọc résumé, mình đánh giá cao những ai có lòng kiên trì và trung thành với đam mê của mình. Người đó tham gia một câu lạc bộ hay một dự án thôi nhưng đóng góp to lớn cho sự thành công của câu lạc bộ hay dự án đó.

2b. Chọn việc vì kỹ năng, thay vì tiền

Điều thứ hai là làm những công việc sinh viên mà bạn biết sẽ cho bạn những kỹ năng cần thiết để hấp dẫn nhà tuyển dụng cho công việc mơ ước của bạn. Các công việc đó có thể là trợ giảng, tình nguyện viên với các tổ chức quốc tế, cộng tác với các báo, làm quản trị ở các diễn đàn chuyên nghiệp. Những công việc này trả lương thấp, thậm chí không trả lương, nhưng sẽ giúp bạn làm quen với môi trường làm việc chuyên nghiệp, giúp bạn xây dựng mối quan hệ, và giúp bạn làm đẹp résumé. Ví dụ, hồi học cấp 3, mình quan tâm đến tài chính nên tham gia làm biên tập cho saga.vn, diễn đàn cho những người khởi nghiệp. Mình học được rất nhiều ở đây, và các anh chị trong Saga giúp mình viết bài đăng trên tạp chí Thị Trường Chứng Khoán khi mình vẫn còn đang là con bé học cấp 3.

Khi mới sang Mỹ, bắt đầu tham gia vào ngành khoa học máy tính, mình nhận ra một điều rằng các công ty bên này rất thích tuyển người làm section leader (trợ giảng) cho một lớp lập trình căn bản trong trường. Họ tin rằng section leader phải hiểu rất rõ các lý thuyết cơ bản, có kỹ năng debug tốt, có khả năng liên lạc tốt. Yêu cầu làm section leader chỉ là học xong lớp căn bản đó. Mình học lớp đó, nộp đơn, và được nhận. Bạn bè mình nhiều người chê công việc trả lương thấp, nhưng với mình, lương thực sự không quan trọng. Mình làm công việc đó vì mình biết nó dạy cho mình nhiều kỹ năng cần thiết và làm đẹp cho résumé của mình. Nhờ công việc đó, mình đã nhận được lời mời phỏng vấn từ cả Google, Facebook, và Microsoft.

Mình đọc trên mạng thấy nhiều bạn mới ra trường đòi lương thế này thế kia mới làm việc. Mình không có vấn đề gì với việc người ứng tuyển đòi lương cao. Thị trường lao động là một thị trường, thuận mua vừa bán. Nhưng mình nghĩ với những bạn mới ra trường, mục tiêu các bạn hướng tới không nên là tiền, mà nên là kỹ năng. Một khi bạn đã thu thập đủ những kỹ năng cần thiết cho công việc mơ ước của bạn, bạn sẽ kiếm được nhiều tiền hơn mức 6-7 triệu/tháng.

2c. Làm những dự án cá nhân

Trong thời gian rảnh rỗi, thay vì ngồi trà đá hay than thở “chán thế”, bạn có thể dành thời gian làm những dự án nhỏ cho riêng bạn. Nếu những dự án này liên quan đến công việc mơ ước của bạn thì càng tốt. Nhưng thường thì dự án nào, miễn là bạn dành thời gian và công sức cho nó, đều có thể dạy cho bạn nhiều kỹ năng.

Vậy bạn có thể làm dự án gì? Trời ơi, vô số ý tưởng. Bạn thích gì thì làm điều đấy. Ví dụ, nếu bạn muốn trở thành nhà báo, bạn có thể có một dự án phỏng vấn những người có nghề nghiệp kỳ lạ. Nếu bạn muốn trở thành kỹ sư thông tin (data scientist), bạn có thể lên Kaggle tham gia các cuộc thi trên đó. Nếu quan tâm đến văn hoá, bạn có thể có dự án tìm hiểu các loại bánh ở Việt Nam. Anh bạn mình thích chơi các trò chơi trí tuệ đã tự mình thiết kế một trò chơi mới. Hồi học cấp 2, mình có một dự án trao đổi sách giáo khoa: bạn có thể quyên góp bộ sách giáo khoa năm trước của mình để đổi lấy bộ sách giáo khoa năm học tiếp theo của bạn. Lên cấp 3, mình làm dự án quyên góp tiền mua bánh trung thu cho trẻ em đường phố.

Các bạn có thể nhờ bạn bè mình cùng nghĩ ra ý tưởng rồi chọn ý tưởng thú vị nhất để thực hiện.

2d. Thương hiệu ăn theo

Mình không thích điều này, nhưng thực tế là nhiều nhà tuyển dụng vẫn đánh giá ứng cử viên dựa vào các mác. Một số trường đại học có giá hơn những trường còn lại, một số công ty cũng có giá hơn những công ty còn lại. Nhiều bạn bè mình vào làm Google không phải vì họ thích làm việc với nhà khổng lồ này, mà vì họ biết, một khi đã có mác Google, họ có thể lựa chọn làm việc ở nhiều công ty lớn khác.

Mình hiểu là không phải ai cũng có cơ hội vào làm Google. Mình muốn chỉ ra rằng các bạn nên ý thức một chút về thương hiệu của tổ chức mà bạn chọn tham gia: trường bạn học, giáo sư bạn làm việc cùng, công ty bạn thực tập. Những thương hiệu đó có thể sẽ giúp ích cho thương hiệu cá nhân của bạn.

3. Xây dựng sự hiện diện trên mạng

Không phải công ty nào cũng thừa nhận điều này, nhưng khả năng nhà tuyển dụng tìm kiếm thông tin về bạn trên mạng là hoàn toàn có thể. Bạn cần xây dựng sự diện diện chuyên nghiệp trên mạng của bạn để thương hiệu cá nhân của bạn trở nên hấp dẫn hơn với nhà tuyển dụng.

Trang đầu tiên bạn nên có là LinkedIn. Đây có thể là trang đầu tiên nhà tuyển dụng tìm đến để biết thêm thông tin về bạn. LinkedIn là mạng xã hội cho người tuyển dụng và người tìm việc. Bạn có trang cá nhân của bạn, khá giống như résumé, nhưng cho bạn nhiều đất hơn. Nhiều người có thể nói dối trên résumé, nhưng LinkedIn là một cái công khai, rất ít người dám liều lĩnh khai gian đến đó. Nó cũng là công cụ để bạn mở rộng mối quan hệ. Bạn có thể xem mối quan hệ giữa bạn và người bạn muốn kết nối, ví dụ, hai người có một mối quan hệ chung và nhờ mối quan hệ chung đó giới thiệu bạn với người bạn muốn kết nối.

Nhiều công ty đăng tuyển dụng trên LinkedIn, bạn có thể ứng tuyển dễ dàng với hồ sơ LinkedIn của mình.

Ngoài LinkedIn là cái tối thiểu nhất ra, kênh trên mạng của bạn tuỳ thuộc vào ngành nghề bạn hướng tới. Nếu bạn là nhà thiết kế hay hoạ sĩ, Behance là một trang bạn nên biết. Với người lập trình, GitHub vô cùng quan trọng. Các cây bút có thể chú ý đến Medium, Goodreads, hoặc tạo blog. Tương tự, sẽ có các trang khác nhau cho nhiếp ảnh gia, kiến trúc sư, người khởi nghiệp.

Nếu bạn muốn có một trang với tất tần tất thông tin về sự nghiệp của bạn, bạn có thể tạo một trang web cá nhân. Tạo một trang web cá nhân khá đơn giản và hoàn toàn miễn phí nếu bạn muốn – bạn thường chỉ trả tiền nếu bạn muốn có domain riêng. Domain riêng chỉ tổn khoảng $10/năm. Mình nói nó không khó vì mình đã có website riêng từ hồi học cấp 3, khi mà mình còn rất nghèo, nói tiếng Anh vẫn rất dở, và không biết lập trình.

Bạn cần phải ý thức rằng bất cứ thông tin gì bạn đưa lên mạng có thể sẽ được sử dụng để chống lại trong quá trình tuyển dụng. Không có gì bạn đưa lên mạng là mang tính cá nhân cả, và không có gì có thể đảm bảo rằng không ai biết bạn làm gì trên mạng. Bạn nghĩ rằng một bình luận không đâu vào đâu trên YouTube hay VOZ sẽ chẳng ảnh hưởng đến ai, nhưng bạn không bao giờ biết được rằng liệu nhà tuyển dụng tương lai có đọc được cái đấy hay không. Mình từ lâu đã không có tài khoản trên các diễn đàn, cũng như ngừng đưa các bức ảnh ăn chơi lên Facebook hay Instagram. Nó vừa giúp mình tiết kiệm thời gian, vừa giúp cho sự hiện diện trên mạng của mình “sạch” hơn.

Sau đây là ví dụ về một số sự hiện diện trên mạng của mình.

Là người tham gia vào thị trường lao động, dĩ nhiên mình có LinkedIn. Mỗi tuần, tên của mình xuất hiện trong khoảng gần 300 tìm kiếm. Một tháng, LinkedIn của mình có khoảng 300 – 400 người xem. Mình nhận được rất nhiều lời mời phỏng vấn từ LinkedIn.

kỹ sư khoa học máy tính, mình đầu tư vào GitHub. Một repo của mình có 1.8k stars (khá cao theo tiêu chuẩn GitHub) và được fork hơn 700 lần. Mình cũng nhận được khá nhiều thư từ những người thú vị qua GitHub.

Là nhà văn, mình bắt đầu đầu tư vào Goodreads của mình. Goodreads liệt kê các cuốn sách mình đã viết, nhưng mình cũng dùng nó để theo sát quá trình đọc của mình. Mỗi khi đọc cuốn sách nào, mình viết nhận xét về cuốn sách đó. Goodreads cho phép mình đọc nhận xét các cuốn sách khác, và giúp mình chọn sách mình muốn đọc.

Mình dùng Twitter chủ yếu để theo dõi những người làm trong ngành mình quan tâm và đọc tin họ đưa, chứ bản thân ít đưa tin.

Trang dạng diễn đàn duy nhất mình tham gia là Quora — nơi mà mình đọc nhiều hơn là tham gia trả lời. Quora là một cộng đồng khá tốt với sự tham gia của rất nhiều chuyên gia. Các câu hỏi bạn đưa ra ở đây thường nhận được những câu trả lời nghiêm túc từ các chuyên gia đầu ngành.

Trước đây, mình có trang web cá nhân (huyenchip.com), nhưng gần đây đã thấy nó không cần thiết. Mình có giữ blog learn365project.com, ý tưởng là mỗi ngày mình học một cái gì đó mới và viết về điều đó.

Nguồn: FB Huyen Chip

Font chữ cho Lập Trình Viên Và xu hướng ligature trong code font

Font chữ cho Lập Trình Viên Và xu hướng ligature trong code font

Bạn có biết trình soạn code của mình đang dùng font chữ gì không? Ít người quan tâm đến điều này nhưng việc lựa chọn font chữ cho code editor cũng ảnh hưởng ít nhiều đến hiệu suất công việc của lập trình viên vì bạn phải nhìn những dòng code nhiều giờ trong một ngày làm việc.

Sau nhiều năm làm việc với nhiều code editor và font khác nhau, tôi rút ra được một số đặc điểm của một font chữ tốt dành cho trình soạn code như sau:

  • Monospace: tất cả các ký tự và khoảng trắng đều cùng một cỡ, điều này cho phép canh cột và lề dễ dàng và code dễ đọc hơn với những đoạn logic lặp lại. Các font mặc định cho code editor và terminal đều là monospace.
  • Dễ dàng phân biệt các ký tự Il1i, 0Oo, CG: có nhiều font monospace hiển thị các ký tự kể trên rất giống nhau, khiến cho việc đọc code khó khăn hơn. Với tiêu chí này, tôi đã loại một số font monospace khá phổ biến như Courier New, Noto Mono, Droid Sans Mono…
  • Các ký tự đặc biệt cho cú pháp phải rõ, dễ đọc() [] {} =+-<>:;,."'
  • Và riêng đối với người Việt mình, thì font cho code cũng cần hỗ trợ tiếng Việt Unicode để hiển thị các chuỗi văn bản hoặc ghi chú bằng tiếng Việt (nếu có). Tiêu chí này cũng loại khá nhiều font mono đẹp và phổ biến khác như: Ubuntu Mono, Menlo, Operator Mono… Nếu bạn không lo vấn đề tiếng Việt, bạn có thể tìm và thử các font kể trên.

Sau đây tôi sẽ liệt kê một số font tiêu biểu cho code editor đáp ứng tất cả các tiêu chí trên:

Consolas

Font này không miễn phí nhưng có sẵn trong Windows hoặc được cài theo bộ Microsoft Office.

Font chữ cho Lập Trình Viên Và xu hướng ligature trong code font

Font Consolas hiển thị trên Sublime Text kích cỡ 15px

Monaco

Font này có sẵn trên macOS.

Font chữ cho Lập Trình Viên Và xu hướng ligature trong code font

Font Monaco hiển thị trên Sublime Text kích cỡ 15px

Roboto Mono

Font monospace của bộ Roboto, font mặc định cho HĐH Android và material design. Download font tại đây.

Font chữ cho Lập Trình Viên Và xu hướng ligature trong code font

Font Roboto Mono (Regular) hiển thị trên Sublime Text kích cỡ 15px

SF Mono

Font SF Mono dùng để hiển thị code bên trong XCode 8+. Bạn có thể download và dùng cho mục đích cá nhân tại trang github này.

Font chữ cho Lập Trình Viên Và xu hướng ligature trong code font

Font SF Mono (Regular) hiển thị trên Sublime Text kích cỡ 15px

Source Code Pro

Font monospace được dựng bởi Adobe dành riêng cho việc hiển thị code nên rất dễ đọc và tròn trịa. Đây là font yêu thích nhất của tôi. Download font tại đây.

Font chữ cho Lập Trình Viên Và xu hướng ligature trong code font

Font Source Code Pro (Regular) hiển thị trên Sublime Text kích cỡ 15px

Space Mono

Font monospace được dựng bởi Colophon Foundry cho Google Fonts. Font này có dáng chữ khá lạ và mang hơi hướng mỹ thuật hơn là cho code. Có thể download tại đây.

Font chữ cho Lập Trình Viên Và xu hướng ligature trong code font

Font Space Mono hiển thị trên Sublime Text kích cỡ 15px

Xu hướng code font mới: Programming Ligature (nối chữ)

Ligature: đây là hiện tượng nối nhiều chữ thành một xuất hiện cùng với kỹ thuật in ấn trong một số ngôn ngữ tự nhiên. Trong thời đại số hóa, ligature cũng được mô phỏng lại (chủ yếu là vì lý do mỹ thuật) thông qua một số font chữ có hỗ trợ. Ligature cũng đã được hỗ trợ trên các trình duyệt hiện đại và đặc biệt là từ IE 10 trở về sau.

ligatureVí dụ ligature

Các ngôn ngữ lập trình sử dụng rất nhiều biểu tượng và toán tử tuy nhiên chúng thường được tổ hợp từ nhiều ký tự đơn giản có sẵn trên bàn phím (VD. >=====>!==…). Điều này bắt buộc người đọc code phải có một quá trình giải mã những tổ hợp ký tự đó thành biểu tượng toán mà chúng đang mô phỏng. (“≥”, “≡”, “⇒”, “≢”)

Một số font code mới đây đã bắt đầu hỗ trợ ligature cho tổ hợp các ký tự toán tử và ký hiệu giúp cho việc hiển thị chúng trực quan hơn. Trong số đó là bộ font Fira Code được dựng với rất nhiều tổ hợp ligature cho lập trình.

Font chữ cho Lập Trình Viên Và xu hướng ligature trong code font

Font Fira Code và ligature

Tuy nhiên Fira Code (và cả Fira Mono mà nó dựa trên) không có các ký tự tiếng Việt Unicode. Để khắc phục, bạn có thể sử dụng một font khác làm fallback khá giống Fira Code đó là Roboto Mono.

Hiện nay đã có một số code editor hỗ trợ ligature, trong đó có VSCode và Atom. Rất tiếc là Sublime Text 3 chưa hỗ trợ, và tính năng này đang được đặt hàng cho nhà phát triển ST3.

Sau khi cài Fira Code vào hệ thống, với VSCode, cần cài đặt các settings sau để bật ligature và font Fira Code với Roboto Mono làm fallback:

{
    "editor.fontFamily": "Fira Code, Roboto Mono, monospace",
    "editor.fontLigatures": true
}

Xem thêm:

Nguồn: int3ractive.com

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

Top 10 công cụ Agile software tốt nhất 2022

Top 10 công cụ Agile software tốt nhất
Top 10 công cụ Agile software tốt nhất

Dưới đây là tổng hợp 10 công cụ Agile (Agile Software Development) hữu ích trong phát triển phần mềm cho bạn.

10. Jira Software (Project management)

Các tính năng chính của JIRA

JIRA nhìn có vẻ rất hiện đại nhưng nó khá phức tạp, chỉ phù hợp với developer có kinh nghiệm, có một UI lởm đồng thời việc học và customize rất khó. Ngoài ra, customization với Jira cũng khá là tốn kém.

  • Khả năng tích hợp: Bởi vì có rất nhiều người dùng tới Jira, nên nhiều sản phẩm được tích hợp sẵn với Jira. Everhour sử dụng Jira cho việc time track tất cả các issues cũng như viết report.
  • Customizable workflows: Tạo ra custom workflows với nhiều qui mô khác nhau phù hợp cho yêu cầu của từng giai đoạn như teams build, test, và release software.
  • Dashboards linh hoạt: Tạo ra chế độ xem cá nhân cho Jira. Chia sẻ dashboards để track project status, tạo report cũng như theo dõi team wallboards.

TOP các việc làm agile hấp dẫn, việc IT chất nhất

9. Trello – Agile instrument (Project management)

Đây là program với visual ấn tượng nhất. Bạn có thể thấy rõ tasks của mình là gì, mức độ ưu tiên và các thành viên liên quan.

Trello khá đơn giản và thiếu nhiều tính năng hữu ích như: không có roadmaps, không có reporting, thiếu backlog charts, và tầm nhìn của dự án khá là nghèo nàn. Nó cũng không hỗ trợ Scrum, phiên bản Kanban thì thiếu swimlanes, WIP bị hạn chế.

8. Aha.io (Project management)

Có nhiều project management tools tuyệt vời được nêu ra trong bài viết này. Nhưng nếu bạn muốn lập trình ra những software tuyệt vời thì bạn sẽ cần những product management tool đa năng hơn như Aha!

Sau khi 2 công ty cuối cùng của Aha được mua lại bởi Aruba Networks và Citrix, Aha mong muốn thay đổi bộ mặt của product và engineering managers, thay vì phải sử dụng những project management tools nghèo nàn.

7. Bamboo (Continuous integration)

Bamboo là một CI server được dùng bởi nhiều team software khác nhau trên toàn thế giới để tự động hóa quá trình quản lí release cho app và software. Nhờ đó mà nhóm sẽ có được một streamlined pipeline của các build khác nhau. Bamboo cho phép developer tự động hóa quá trình build và test nhằm có thêm thời gian cho việc cải thiện sản phẩm. Mobile developers có thể  tự động deploy apps lên Apple Store hoặc Google Play.

Các tính năng chính:

  • Dùng Bamboo với stack ưa thích của bạn, bao gồm Docker, AWS, và S3;
  • Custom deployment projects nhằm theo dõi lịch sử của từng phiên bản được release
  • Fix nhiều bugs nặng nhanh chóng nhờ vào custom agents  
  • Outline chi tiết lịch sử code của bạn trước khi deploy, nhằm giúp bạn hiểu rõ thêm về tiến triển của project
  • Tương thích với Bitbucket và JIRA cho ra một Trải nghiệm CI tuyệt vời
  • Với per-environment permissions, developers và QA có thể deploy đến environments của mình theo nhu cầu trong khi quá trình production vẫn còn locked-down.

Xem thêm các tin đăng việc làm software developer trên TopDev

6. TeamCity (CI/CD)

Một CI server đã có tuổi, đến từ phòng nghiên cứu của công ty JetBrains. Được biết đến bởi làng công nghệ toàn thế giới, các sản phẩm của JetBrains như WebStorm và ReSharper  được sự đón chào nồng nhiệt từ các developers.

TeamCity cung cấp tất cả các tính năng trong phiên bản miễn phí, thế nhưng bạn sẽ bị giới hạn với chỉ 20 configurations và 3 build agents. Mặc khác, bạn cũng cần phải bỏ tiền ra mua build agents và configurations.

TeamCity còn chạy được trên đa platforms khác nhau và có hỗ trợ cho nhiều tool và framework.  Ngoài ra, JetBrains cũng hợp tác với các nhóm developer khác nhau nhằm tạo ra những plugins vô cùng hữu ích.

Mặc dù được tạo ra nhằm giải quyết vấn đề cho Java, TeamCity lại có hỗ trợ cho .NET tốt nhất trong số các tool được liệt kê trong bài viết này. Ngoài ra enterprise packages cũng có nhiều gói khác nhau tùy vào số agents.

Đánh giá: Nhìn tổng quát, TeamCity thật sự là khá tuyệt nhưng do nó phức tạp lại mắc tiền nên chỉ phù hợp với doanh nghiệp hơn là cá nhân.

5. Cicle Ci (CI/CD)

CircleCI cung cấp môt nền tảng cho platform nhằm integration và delivery, giúp cho hàng ngàn team, trên toàn thế giới, release code của mình qua build automation, test automation,và một quá trình deployment. Với cách thức tiếp cận hiện đại, phù hợp với nhu cầu của các software teams, bạn có thể tin tưởng vào CircleCI sẽ giúp cải thiện hiệu năng, với qui mô nhỏ lớn khác nhau.

Tính năng chính:

  • Create an account, add a project, and start building. The platform can grab custom settings from your code directly
  • Custom integration with Maven, Gradle, and other top-notch build tools
  • Using Django, Nose, RSpec, and countless others, CircleCI will do a stellar job at testing your code, while you’re busy shipping your next product
  • Flawless integration with AWS, Heroku, Google Cloud, and others
  • CircleCI automatically uses language-specific tools like rvm and virtualenv to ensure dependencies are installed into an isolated environment

4. GitLab (CI/CD)

Với sự phát triển nhanh chóng từ code management platform cho các developer. Nó cung cấp tools cho issue management, code views, continuous integration và deployment, tất cả đều nằm gọn trong một dashboard duy nhất. Từ giai đoạn thai nghén ý tưởng cho đến phát triển thành sản phẩm, với GitLab, bạn sẽ có được góc nhìn từ trên cao, rõ ràng và chi tiết hơn về hướng project của bạn sẽ phát triển như thế nào. GitLab đưa các pre-built packages cho Linux distributions, quá trình cài đặt sẽ diễn ra chỉ trong vòng vài phút, với một UI thân thiện, kèm theo đó là tài liệu vô cùng chi tiết.

Tính năng chính:

  • Integrated directly into the GitLab workflow
  • Add additional machines to scale your tests for performance
  • CMD build scripts allow you to program them in any language
  • Custom version tests to check branches individually
  • Manual deployment, and effortless rollback capabilities

3. Travis CI (CI/CD)

CI platform với khả năng tự động hóa quá trình software testing và deploy app. Nó được tạo ra như một platform để integrates với GitHub projects để bạn có thể thoải mái test code của mình. Với những khách hàng như Facebook, Mozilla, Twitter, Heroku, và những hãng khác nữa, Travis CI là một những integration tools đứng đầu của thị trường.

Những tính năng chính:

  • Miễn phí cho các open source projected trên GitHub
  • Rất đơn giản, chỉ cần sign up, thêm một project và bạn đã có thể bắt đầu test.
  • Hỗ trợ đa ngôn ngữ để bạn có thể code dễ dàng trên mọi phiên bản
  • Automated pull request verification
  • Hoạt động được với Email, Slack, HipChat và nhiều ứng dụng khác nhằm gửi notifications dễ dàng hơn
  • Extended API và CMD tools dành cho custom management

2. Codeship (CI/CD)

Là một Hosted continuous integration platform, tập trung vào hiệu năng, tốc độ và đơn giản hóa. Team của bạn có thể dùng Codeship để test, build và deploy trực tiếp từ Github project. Nó cũng tương thích với cả Bitbucket. Codeship có các tính năng kết hợp với  integration và delivery để code của bạn có thể deploy đúng sau khi test automation hoàn thành.

Các tính năng chính:

  • One-click signup cho GitHub, GitLab, và Bitbucket
  • Cực kì dễ customizable với native support cho Docker
  • Cấu trúc vô cùng hiệu quả với khả năng theo dõi và scale theo yêu cầu của bạn
  • Hệ quản lí config file đơn giản, giúp bạn làm việc nhanh hơn
  • UI tối giản cho setting up  

1. Jenkins (CI/CD)

Jenkins chính là open-source project số một dành cho automate project của bạn. Với hàng ngàn plugins cho bạn thoải mái lựa chọn, Jenkins có thể giúp team tự động hóa mọi task vốn sẽ tốn kém rất nhiều thời gian cho quá trình phát triển của project. Jenkins thường được dùng cho tạo project, chạy test, phát hiện bug, phân tích code và project deploy.

Các tính năng chính:

  • Jenkins hoạt động như một CI server độc lập, hoặc bạn có thể biến nó thành continuous delivery platform  dành cho bất kì project nào của mình.
  • Pre-built packages cho Unix, Windows,và OS X bảo đảm việc cài đặt diễn ra dễ dàng.
  • Một web interface để có thể configure server của bạn nhanh chóng
  • Custom plugins dành cho build và source code management, administrative tasks, user interface, và platforms
  • Có khả năng deploy khắp mạng lưới network của các máy, cải thiện hiệu năng của build và test.
  • Cộng đồng lớn với các hãng công nghệ khổng lồ chung tay phát triển

Nguồn: topdev.vn via Codecamp

Tại sao nhà tuyển dụng nên chọn bạn mà không phải là các ứng viên khác?

Tại sao nhà tuyển dụng nên chọn bạn mà không phải là các ứng viên khác?

Khi đi xin việc, chúng ta thường được hỏi: “Tại sao chúng tôi nên chọn bạn mà không phải là một người khác?”. Đây là một dạng câu hỏi để tìm hiểu những điểm mạnh của các ứng viên. Nếu bạn không biết các đối thủ của mình là ai thì đây là một câu hỏi để bạn bộc lộ được tính cách và khả năng của mình. Nếu bạn thể hiện tốt đồng nghĩa bạn đã biết thể hiện điểm mạnh, điểm yếu của bản thân và tạo ra cơ hội để trở thành ứng viên phù hợp nhất cho vị trí ứng tuyển.

1) Doanh nghiệp tuyển dụng để giải quyết những vấn đề trong công ty

Trong phỏng vấn, người tuyển dụng có thể đòi hỏi và yêu cầu rất nhiều từ ứng viên. Bạn cần tìm hiểu liệu công việc có cung cấp được những mong muốn mà bạn cần để phát triển nghề nghiệp, các yêu cầu tài chính trong khi người quản lý tuyển dụng đang cố thuê một người để giải quyết những vấn đề cho công ty họ.

Tất nhiên mục tiêu cuối cùng của một buổi phỏng vấn việc làm là tìm được một người để giải quyết những vấn đề của doanh nghiệp. Những vấn đề đó có thể đơn giản như: đảm bảo cho công ty đạt được các mục tiêu về tài chính. Hoặc có thể là một vấn đề phức tạp hơn như tổ chức đang trong quá trình tái cơ cấu thì đó sẽ là làm công ty phát triển, hoặc đảm bảo vị thế của doanh nghiệp trên thị trường. Dù trong bất kỳ trường hợp nào, bạn phải tìm ra vấn đề đó là gì, và chỉ ra rằng bạn có thể giải quyết vấn đề đó tốt hơn bất cứ ứng viên nào.

2) So sánh CV với bảng mô tả công việc

Để có một câu trả lời hiệu quả, bước đầu tiên bạn cần phân tích cẩn thận yêu cầu các yêu cầu của công việc.

Xem lại những tin quảng cảo về công việc và tìm kiếm các từ khóa mô tả vai trò. Kiểm tra lại bảng mô tả công việc trên trang web của doanh nghiệp vì thông tin trên đó có thể nhiều hơn và tích hợp cho bạn tiếp cận.

Bạn nên làm quen với bản mô tả công việc trước khi xin việc làm. Bằng cách đó bạn có thể điều chỉnh hồ sơ và thư giới thiệu sao cho phù hợp nhất với những gì công ty đang tìm kiếm.

3) Liệt kê những yêu cầu mà người tuyển dụng cần

Nếu người tuyển dụng đã cung cấp một danh sách chi tiết các yêu cầu và những điều họ quan tâm trong bảng mô tả công việc thì bạn có thể thực hiện các bước tiếp theo. Nếu chưa có, bạn hãy tìm kiếm công việc đó trên các trang web tuyển dụng bằng những từ khóa tương tự. Đặc biệt mạng xã hội LinkedIn rất hữu ích. Xem hồ sơ các nhân viên hiện tại của công ty cũng là cách để bạn thấy được những kỹ năng và thành tích mà công ty quan tâm. Sau đó, tìm kiếm hồ sơ của các thành viên có chức danh tương tự ở những công ty khác, để xem những gì áp dụng cho vị trí đó nói chung trên toàn thị trường. Một cách khác để hiểu rõ hơn sở thích của người sử dụng lao động là nói chuyện, tìm lời khuyên từ các chuyên gia trong lĩnh vực để có được cái nhìn của họ về những gì họ cần để có được thành công trong vị trí đó.

4) Liệt kê những kỹ năng mà công việc cần

Hãy tạo một danh sách những bằng cấp, yêu cầu tiên quyết cho công việc mà bạn đang ứng tuyển. Với mỗi yêu cầu trong danh sách, hãy xem lại những kinh nghiệm bạn có, những công việc tình nguyện đã làm và quá trình học, từ đó đưa ra những dẫn chứng phù hợp cho công việc bạn đang nộp.

Nếu bạn đưa ra được một ví dụ chứng minh cách bạn đã sử dụng điểm mạnh đó trong công việc, cuộc sống, bạn sẽ gây ấn tượng hơn với nhà tuyển dụng. Khi chuẩn bị cho buổi phỏng vấn, bạn hãy tự thực hành trả lời các câu hỏi để thể hiện bản thân tốt nhất.

5) Đưa ra lý do tại sao bạn nên nhận việc

Chuẩn bị để chia sẻ lại những kinh nghiệm, dự án hoặc thách thức, cùng với những hành động mà bạn thực hiện để thể hiện tài sản và các kết quả tích cực. Tài sản của bạn có thể là kỹ năng, kiến thức hoặc chuyên môn, phẩm chất cá nhân hoặc các lĩnh vực có liên quan của kinh nghiệm.

Chọn từ 5 đến 7 điểm mạnh tương ứng với yêu cầu công việc và sử dụng những điểm này làm cốt lõi cho câu trả lời của bạn về những gì làm nổi bật bạn với các ứng viên khác.

Bạn có thể thêm một vài tính cách đặc biệt khác mà thường giúp bạn thành công trong công việc và chúng sẽ giúp bạn gây ấn tượng với người phỏng vấn.

Tham khảo thêm các nhà tuyển dụng HOT tại đây

Cloud Devops quan trọng như thế nào?

devops1

Ngày nay tính linh hoạt và khả năng thích ứng là rất quan trọng trong môi trường CNTT. Thực tế đã chứng minh dù là trong bất kỳ lĩnh vực nào thì hiệu quả sản phẩm cũng là yếu tố quyết định đến khả năng cạnh tranh của doanh nghiệp trên thị trường. Kết quả là, một số công ty đã bỏ qua các phương pháp truyền thống và bắt đầu sử dụng công nghệ điện toán đám mây và kỹ thuật số để tạo ra sản phẩm cuối cùng ổn định và hiệu quả hơn. Khác với  cách di chuyển Cloud trước đây, đã có một sự thay đổi trong cách ứng dụng đang được phát triển. Bài viết này sẽ chứng minh DevOps và cloud là một kết hợp hoàn hảo.

Trước khi DevOps

Cơ sở hạ tầng, triển khai ứng dụng và cập nhật là một trong những vấn đề lớn cho bất kỳ vòng đời phát triển nào. Nếu bạn có thể giải quyết những quy trình này một cách hợp lý tôi nghĩ bạn có thể đối mặt với những yêu cầu không ngừng thay đổi của khách hàng một cách dễ dàng. Đầu tư vào phát triển cơ sở hạ tầng tốn kém và cồng kềnh những năm trở lại đây đã hoàn toàn bị thay thế bởi điện toán đám mây.

Có 1 điều khá thú vị là điện toán đám mây không chỉ cung cấp cơ sở hạ tầng một cách dễ dàng với giá cả phải chăng mà còn giảm chi phí bảo trì cơ sở hạ tầng. Chỉ với một vài cú nhấp chuột, cơ sở hạ tầng cơ bản của bạn đã có thể hoạt động. Trước đây một khi lập trình viên làm việc với module, họ phải commit code của họ vào các trình quản quản lý source. Điều này có nghĩa là việc built ứng dụng không thể hoàn thành cho đến khi các lập trình viên khác đã hoàn tất viết code cho mô-đun của họ.

Sau khi hoàn thành toàn bộ code căn bản, mọi thứ đã được bàn giao cho nhóm tester và cuối cùng mới cho ra sản phẩm.

Quá trình từ phát triển sản phẩm đến sản xuất, toàn bộ chu kỳ tốn rất nhiều thời gian do phải lặp đi, lặp lại các lỗi kỹ thuật. Thêm vào đó, nhóm vận hành và nhóm phát triển chưa bao giờ ngồi xuống cùng nhau đưa ra quyết định.

Tham khảo việc làm Devops lương cao trên TopDev

Những thách thức đáng kể mà ngành CNTT gặp phải khi phát triển nhanh là:

  • Sự không thống nhất giữa các môi trường Dev và Ops
  • Hạn chế thời gian cho các bản phát hành thường xuyên
  • Triển khai chậm giữa hai đội làm giảm hiệu suất tổng thể
  • Khó khăn khi quản lý nhiều cấu hình và phiên bản ứng dụng
  • Nguy cơ lỗi cao hơn do can thiệp bằng phương pháp thủ công
  • Chi phí cao hơn
  Top 5 câu hỏi phỏng vấn Devops Engineer thường gặp và cách trả lời

Sau khi Cloud DevOps

Cá nhân tôi nghĩ rằng DevOps không phải là một công cụ cũng không phải là một công nghệ. Đó là một nền văn hóa có tổ chức nhằm tạo thuận lợi cho truyền thông, hợp tác và hội nhập hiệu quả giữa các nhóm phát triển và nhóm vận hành sản phẩm. Trong trường hợp này, công việc của developer và operational không được phân biệt tác bạch, rõ ràng mà cùng hợp lại với nhau để đẩy nhanh quá trình và tạo ra ít lỗi hơn.

Với việc thông qua một số công cụ phần mềm mã nguồn mở thông minh liên quan đến kiểm soát code, tích hợp liên tục và quản lý cấu hình. Hiện tại, có một vài công cụ dựa vào các thành phần phân phối, Cloud DevOps cung cấp nhiều lợi ích đáng kể. Thực tế, Cloud DevOps cung cấp một cơ sở hạ tầng có khả năng mở rộng cho một công ty phát triển ứng dụng phần mềm.

  Làm thế nào để tìm được những "nhân tài" DevOps phù hợp nhất?

Lợi ích:

Quá trình thống nhất-toàn bộ vòng đời, tức là từ lúc phát triển sản phẩm đến lúc đưa vào hoạt động có thể được xem như là một quá trình từ đầu đến cuối. Điều này có nghĩa là các nhà phát triển không còn cần đợi các nhóm tester kiểm tra code trước khi triển khai ứng dụng trong môi trường họ mong muốn.

  • Tự động hóa-ít cơ hội sai sót, nhất quán, phân phối phần mềm nhanh
  • Tập trung vào sự ổn định và thời gian hoạt động-Cải thiện trải nghiệm của khách hàng
  • Hợp tác nhiều hơn– các vấn đề phát sinh giữa các nhóm đã được giải quyết nhanh chóng và dứt khoát
  • Service Visualization – phát triển kích thích/ song song
  • Phát triển nhanh nhẹn – Cloud DevOps hòa hợp tốt với Agile và cung cấp một sự hỗ trợ tuyệt vời để đạt được những mục tiêu ngay lập tức.

Kết luận

Cloud đã trở thành xu hướng mới cho hầu hết các lĩnh vực kỹ thuật cũng như phi kỹ thuật. Ngày nay áp dụng kỹ thuật số và công nghệ để phát triển landscape, cloud và DevOps được kết hợp chặc chẽ với nhau.

Nguồn: topdev.vn via scotch.io

Tham khảo các tin đăng tuyển dụng IT mới nhất trên TopDev

12 Packages và Libraries của Go cực kì mạnh mẽ mà bạn cần phải biết

Go la một ngôn ngữ lập trình vô cùng tuyệt vời và tiềm năng, với phong cách đơn giản hóa. Được thể hiện khá rõ với standard library, vốn chứa tất cả mọi thứ cần thiết, nhưng không hề dư thừa.

Thật may, Go có một cộng đồng khá sôi động với nhiều libraries của “third-party” được chia sẻ tại đây. Trong bài hướng dẫn này, tôi sẽ giới thiệu cho bạn 12 package và libraries tốt nhất của Go. Trải dài từ qui mô nhỏ thích hợp cho mọi project cho đến các hệ thống xử lí cực lớn và phức tạp.

Awesome Go

Trước khi nhảy vào tìm hiểu về libraries, tôi muốn giới thiệu các bạn về Awesome Go, một list danh sách các Go libraries và những nguồn khác, khá chính xác và luôn được cập nhật thường xuyên. Nên hãy bỏ công vào xem nhé.

Golang-Set

Go có arrays, slices và maps, nhưng nó lại không có một set data structure. bạn có thể bước trước một set với một map của bools, nhưng nó vẫn sẽ luôn tốt hơn nếu ta có data type thật với operations đúng. Đó chính là mục đích của golang-set. Sau đây là một ví dụ tạo ra một set mới, thêm items và testing cho membership:

package main
 
import (
    "fmt"
    "github.com/deckarep/golang-set"
)
 
 
func main() {
    basicColors := mapset.NewSet()
    basicColors.Add("Red")
    basicColors.Add("Blue")
    basicColors.Add("Green")
 
    if basicColors.Contains("Green") {
        fmt.Println("Yay! 'Green' is a basic color")
    } else {
        fmt.Println("What a disappointment! 'Green' is not a basic color")
    }
 
 
    if basicColors.Contains("Yellow") {
        fmt.Println("Yay! 'Yellow' is a basic color")
    } else {
        fmt.Println("What a disappointment! 'Yellow' is not a basic color")
    }
}
 
Output:
 
Yay! 'Green' is a basic color
What a disappointment! 'Yellow' is not a basic color

Lưu ý rằng do package  có tên là “mapset”. Ngoài mấy tính năng cơ bản ra, bạn có thể thực hiện được tất cả các loại set operations như union, intersection, và difference. Bạn cũng lặp được set các giá trị:

package main
 
import (
    "fmt"
    "github.com/deckarep/golang-set"
)
 
 
func main() {
    basicColors := mapset.NewSet()
    basicColors.Add("Red")
    basicColors.Add("Blue")
    basicColors.Add("Green")
 
    otherColors := mapset.NewSetFromSlice([]interface{}{"Orange", "Yellow", "Indigo", "Violet"})
    rainbowColors := basicColors.Union(otherColors)
 
    for color := range rainbowColors.Iterator().C {
        fmt.Println(color)
    }
}

Color

Hãy tiếp tục với color theme. Khi bạn đang viết command-line programs, việc có thể highlight những messages quan trọng, hay phân biệt giữa errors, successes, và warnings là cực kì hữu ích.

color package cho bạn khả năng thêm nhiều màu sắc khác nhau cho chương trình của mình. Nó dùng ANSII escape codes và supports cả hệ điều hành Windows. Sau đây là một ví dụ đơn giản:

package main
 
import (
    "github.com/fatih/color"
)
 
func main() {
    color.Red("Roses are red")
    color.Blue("Violets are blue")
}

Color package hỗ trợ tính năng trộn và kết hợp màu với màu của background, style như bold hoặc italic, dùng màu với non-color output.

package main
 
import (
    "github.com/fatih/color"
    "fmt"
)
 
func main() {
    minion := color.New(color.FgBlack).Add(color.BgYellow).Add(color.Bold)
    minion.Println("Minion says: banana!!!!!!")
 
    m := minion.PrintlnFunc()
    m("I want another banana!!!!!")
 
    slantedRed := color.New(color.FgRed, color.BgWhite, color.Italic).SprintFunc()
    fmt.Println("I've made a huge", slantedRed("mistake"))
}

Color package còn có những tính năng hữu ích khác mà bạn nên khám phá thêm.

Now

Now là mộ package khá đơn giản với tính năng cung cấp một wrapper cho standard time package và nó rất dễ dùng với ngày và thời gian khác nhau xung quanh thời điểm hiện tại.

Ví dụ như bạn có thể bắt đầu với thời điểm hiện tại hoặc tại cuối ngày chủ nhật cho đến thời điểm hiện tại. Sau đây là cách dùng cho thời điểm là “ngay bây giờ”:

package main
 
import (
    "github.com/jinzhu/now"
    "fmt"
)
 
func main() {
 
    fmt.Println("All the beginnings...")
    fmt.Println(now.BeginningOfMinute())
    fmt.Println(now.BeginningOfHour())
    fmt.Println(now.BeginningOfDay())
    fmt.Println(now.BeginningOfWeek())
    fmt.Println(now.BeginningOfMonth())
    fmt.Println(now.BeginningOfQuarter())
    fmt.Println(now.BeginningOfYear())
 
}
 
Output:
 
All the beginnings...
2017-06-04 16:59:00 -0700 PDT
2017-06-04 16:00:00 -0700 PDT
2017-06-04 00:00:00 -0700 PDT
2017-06-04 00:00:00 -0700 PDT
2017-06-01 00:00:00 -0700 PDT
2017-04-01 00:00:00 -0700 PDT
2016-12-31 23:00:00 -0800 PST

Bạn còn có thể parse thời gian và thêm vào format của riêng bạn.  Now type sẽ in vào  time.Time, nên bạn có thể dùng tất cả cách thức  time.Time trực tiếp lên  Now objects.

Gen

gen tool tạo ra code cho bạn – chính xác là chúng cho ra code thuộc type-aware với tính năng giảm bớt khoảng cách không có templates hoặc generics trong Go.

Bạn cần chú thích types của mình với comment đặc biệt. cũng như các gen generates source files mà bạn dùng trong project của mình. Sau đây là một cách để dùng annotated type:

// +gen slice:"Where,Count,GroupBy[int]"
type Person struct {
    Name string
    Age int
}

Chạy gen sẽ tạo ra  person_slice.go:

// Generated by: gen
// TypeWriter: slice
// Directive: +gen on Person
 
package main
 
// PersonSlice is a slice of type Person. Use it where you would use []Person.
type PersonSlice []Person
 
// Where returns a new PersonSlice whose elements return true for func. See: http://clipperhouse.github.io/gen/#Where
func (rcv PersonSlice) Where(fn func(Person) bool) (result PersonSlice) {
    for _, v := range rcv {
        if fn(v) {
            result = append(result, v)
        }
    }
    return result
}
 
// Count gives the number elements of PersonSlice that return true for the passed func. See: http://clipperhouse.github.io/gen/#Count
func (rcv PersonSlice) Count(fn func(Person) bool) (result int) {
    for _, v := range rcv {
        if fn(v) {
            result++
        }
    }
    return
}
 
// GroupByInt groups elements into a map keyed by int. See: http://clipperhouse.github.io/gen/#GroupBy
func (rcv PersonSlice) GroupByInt(fn func(Person) int) map[int]PersonSlice {
    result := make(map[int]PersonSlice)
    for _, v := range rcv {
        key := fn(v)
        result[key] = append(result[key], v)
    }
    return result
}

 

Code sẽ cung cấp những phương thức tương tự như LINQ để vận hành trên PersonSlice type. Nó khá dễ hiểu cũng như dễ lưu trữ.

Bạn có thể dùng nó với cách sau: Trong main function, một  PersonSlice đã được defined.  age() function chọn ra tuổi thích hợp trong  Person argument của nó.  GroupByInt() function được tạo ra và nó sẽ lấy giá trị của age() function và trả về với kết quả là nhóm những người với độ tuổi giống nhau:

package main
 
import (
    "fmt"
)
 
// +gen slice:"Where,Count,GroupBy[int]"
type Person struct {
    Name string
    Age int
}
 
func age(p Person) int {
    return p.Age
}
 
func main() {
    people := PersonSlice {
        {"Jim", 34},
        {"Jane", 23},
        {"Kyle", 23},
    }
 
    groupedByAge := people.GroupByInt(age)
 
    fmt.Println(groupedByAge)
}
 
 
Output:
 
map[34:[{Jim 34}] 23:[{Jane 23} {Kyle 23}]]

Gorm

Go được biết tới với khả năng cực kì mạnh mẽ. Lập trình Database cũng không phải là ngoại lệ. Phần lớn các DB libraries dành cho Go vẫn còn khá đơn sơ. Gorm mang tới object-relational mapping  cho Go với những tính năng như:

  • Associations (Has One, Has Many, Belongs To, Many To Many, Polymorphism)
  • Callbacks (Before/After Create/Save/Update/Delete/Find)
  • Preloading (eager loading)
  • Transactions
  • Composite Primary Key
  • SQL Builder
  • Auto Migrations
  • Logger
  • Mở rộng được, viết Plugins dựa trên GORM callbacks

Nhưng nó không phải là làm được hết mọi thứ. Nếu bạn chuyển qua từ Python thì đừng mong chờ vào SQLAlchemy. Sau đây là cách dùng Gorm với sqlite. Lưu ý  gorm.Model được đặt trong Product struct.

package main
 
import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
)
 
type Product struct {
  gorm.Model
  Code string
  Price uint
}
 
func main() {
  db, err := gorm.Open("sqlite3", "test.db")
  if err != nil {
    panic("failed to connect database")
  }
  defer db.Close()
 
  // Migrate the schema
  db.AutoMigrate(&Product{})
 
  // Create
  db.Create(&Product{Code: "L1212", Price: 1000})
 
  // Read
  var product Product
  db.First(&product, 1) // find product with id 1
  db.First(&product, "code = ?", "L1212")
 
  // Update - update product's price to 2000
  db.Model(&product).Update("Price", 2000)
 
  // Delete - delete product
  db.Delete(&product)

 

Goose

Một trong những tasks quan trọng nhất khi làm việc với relational databases là quản lí schema. Modifying DB schema được xem là thay đổi khá đáng sợ đối với nhiều người. goose package  cho phép bạn thực hiện các thay đổi với schema và cả di chuyển dữ liệu nếu cần. Bạn có thể  goose up và  goose down để di chuyển về trước hoặc lui lại. Nhưng nhớ là đừng để data của bạn bị mất hoặc corrupted.

Goose hoạt động bằng cách phân biệt schema ra từng phiên bản và dùng các files tùy theo từng schema. Các files đó có thể là SQL commands hoặc Go commands. Sau đây là một ví dụ SQL migration file thêm một table mới:

-- +goose Up
CREATE TABLE person (
    id int NOT NULL,
    name text,
    age int,
    PRIMARY KEY(id)
);
 
-- +goose Down
DROP TABLE person;

 -- +goose up & -- +goose down comment sẽ cho goose biết nên upgrade hay downgrade  schema.

Glide

Glide là một package manager dành cho Go. Với  GOPATH, bạn có thể sẽ có nhiều chương trình bị xung đột dependencies. Giải pháp cho vấn đề trên là cho từng program quản lí vendor directory của package dependencies. Đây chính là lúc Glide thể hiện sức mạnh của nó.

Một vài tính năng nổi bật của Glide:

  • Support versioning packages bao gồm Semantic Versioning 2.0.0 support.
  • Support aliasing packages (e.g. để làm với Github).
  • Remove the need for munging import statements.
  • Tương thích với toàn bộ go tools.
  • Support tất cả VCS tools được Go supports (git, bzr, hg, svn).
  • Support custom local và global plugins.
  • Repository caching và data caching để cải thiện hiệu năng.
  • Flatten dependencies, giải quyết việc khác phiên bản và tránh đưa vào một package nhiều lần.
  • Quản lí và cài đặt dependencies theo yêu cầu trong version control system.

Các dependencies  sẽ được lưu trữ trong glide.yaml, và glide cung cấp một số commands để quản lí dependencies:

create, init       Initialize a new project, creating a 
                   glide.yaml file
config-wizard, cw  Wizard that makes optional suggestions 
                   to improve config in a glide.yaml file.
get                Install one or more packages into 
                   `vendor/` and add dependency to 
                   glide.yaml.
remove, rm         Remove a package from the glide.yaml 
                   file, and regenerate the lock file.
import             Import files from other dependency 
                   management systems.
name               Print the name of this project.
novendor, nv       List all non-vendor paths in a 
                   directory.
rebuild            Rebuild ('go build') the dependencies
install, i         Install a project's dependencies
update, up         Update a project's dependencies
tree               (Deprecated) Tree prints the 
                   dependencies of this project as a tree.
list               List prints all dependencies that the 
                   present code references.
info               Info prints information about this 
                   project
cache-clear, cc    Clears the Glide cache.
about              Learn about Glide
mirror             Manage mirrors
help, h            Shows a list of commands or help for 
                   one command

Ginkgo

Ginkgo là một BDD (Behavior Driven Development) testing framework. Nó cho phép bạn viết các bài tests trong một syntax tương tự như English mà người xem dù có ít kinh nghiệm vẫn có thể hiểu được cũng như kiểm tra nó có phù hợp với yêu cầu của họ không.

Một số developers cũng rất thích test kiểu này. Nó được tích hợp với Go’s built-in testing package và thường được kết hợp với Gomega. Sau đây là một ví dụ với Ginkgo + Gomega test:

actual, err := foo()
Ω(err).Should(BeNil())
Ω(actual).ShouldNot(BeNil())
Ω(actual.result).Should(Equal(100))

Etcd

Etcd là distributed Key-Value store rất đáng tin cậy. Server được implemented vào Go, và Go client tương tác với nó thông qua gRPC.

Etcd tập trung vào những điều sau:

  • Đơn giản: Thiết kế gọn, user-facing API (gRPC).
  • An toàn: automatic TLS vớioptional client cert authentication.
  • Nhanh: benchmarked 10,000 writes/sec.
  • Tin cậy: được Distributed sử dụng Raft.

Sau đây là một ví dụ với kết nối server, thêm và lấy giá trị, bao gồm timeouts và cleanup.

func test_get() {
    cli, err := clientv3.New(clientv3.Config{
        Endpoints:   endpoints,
        DialTimeout: dialTimeout,
    })
    if err != nil {
        log.Fatal(err)
    }
    defer cli.Close()
 
    _, err = cli.Put(context.TODO(), "foo", "bar")
    if err != nil {
        log.Fatal(err)
    }
 
    ctx, cancel := context.WithTimeout(context.Background(), 
                                       requestTimeout)
    resp, err := cli.Get(ctx, "foo")
    cancel()
    if err != nil {
        log.Fatal(err)
    }
    for _, ev := range resp.Kvs {
        fmt.Printf("%s : %s\n", ev.Key, ev.Value)
    }
    // Output: foo : bar
}

NSQ

NSQ là một distributed queue. Tôi từng dùng nó cho primary building block của distributed systems với qui mô lớn. NSQ thật sự rất tuyệt vời những tính năng như:

  • Hỗ trợ distributed topologies với no SPOF.
  • Horizontally scalable (không cần brokers, dể dàng thêm nodes vào cluster).
  • Low-latency push based message delivery (performance).
  • Kết hợp load-balanced và multicast style message routing.
  • Cực kì mạnh mẽ với streaming (high-throughput) và job oriented (low-throughput) workloads.
  • Primarily in-memory
  • Runtime discovery service cho consumers để tìm producers (nsqlookupd).
  • Transport layer security (TLS).
  • Data format agnostic.
  • Ít dependencies (dễ deploy) và một default configuration dễ dùng.
  • TCP protocol supporting client libraries cực kì tối giản với nhiều ngôn ngữ khác nhau.
  • HTTP interface cho stats, admin actions, và producers ( không cần client library để publish).
  • Integrates với statsd cho real-time instrumentation.
  • Robust cluster administration interface (nsqadmin).

Sau đây là cách chúng ta đưa message tới NSQ:

package main
 
import (
  "github.com/bitly/go-nsq"
)
 
func main() {
  config := nsq.NewConfig()
  p, _ := nsq.NewProducer("127.0.0.1:4150", config)
 
  p.Publish("topic", []byte("message"))
  p.Stop()
}

Còn dưới đây là cách consume:

package main
 
import (
  "sync"
  "fmt"
  "github.com/bitly/go-nsq"
)
 
func main() {
  wg := &sync.WaitGroup{}
  wg.Add(1)
 
  config := nsq.NewConfig()
  q, _ := nsq.NewConsumer("topic", "channel", config)
  handler := nsq.HandlerFunc(func(message *nsq.Message) error {
      fmt.Printf("Got a message: %v", message)
      wg.Done()
      return nil
  })
  q.AddHandler(handler)
  q.ConnectToNSQD("127.0.0.1:4150")
  wg.Wait()
}

Docker

Bạn có thể không hề biết về Docker vốn được tích hợp trong Go. Bạn thường không dùng Docker trong Code của mình, tuy vậy Docker vẫn được xem là một Go project lớn và khá thành công.

Kubernetes

Kubernetes là open-source container orchestration platform dành cho cloud-native applications. Có thể nói cũng là một con quái vật distributed system được tích hợp vào Go. Tôi có viết một cuốn sách  Mastering Kubernetes, giải thích khá cận kẽ những thế mạnh của Kubernetes. Đến từ một Go developer, tôi nghĩ rằng Kubernetes cực kì linh hoạt, cho phép bạn mở rộng cũng như customize với plugins.

Lời kết  

Go là một ngôn ngữ lập trình tuyệt vời. Với phong cách thiết kế tối giản và thân thiện với người dùng. Kèm theo đó library của Go không qua deep như những ngôn ngữ khác.

Mặt khác, cộng đồng Go được xem là một trong những community tích cực trong thế giới lập trình, cung cấp cho bạn rất nhiều library chất lượng để sử dụng cho project của mình.

Nguồn: code.tutplus.com

Single page app không hề tệ như bạn nghĩ

Tôi vừa đọc qua một bài viết nói về những vấn đề thường thấy với Single Page App. Là một lập trình viên lâu năm về React và AngularJS, tôi hiểu một số lí do mà anh ấy đưa ra. Để làm ra một SPA tốt là chuyện không hề dễ dàng gì. Với lợi thế trong việc tạo ra trải nghiệm tuyệt vời cho user nhưng đồng thời đòi hỏi rất nhiều công sức.

Sau đây là một số lí do nhiều người không thích SPA:

  • Có quá nhiều SPA framework để chọn và mỗi framework lại có một ecosystem riêng khiến cho bạn phải suy nghĩ rất kĩ về lựa chọn của mình
  • Đòi hỏi nhiều công sức để làm UX tốt
  • Yêu cầu nhiều developer để làm một dự án. Chỉ có backend developer thì SPA sẽ không bao giờ được hoàn chỉnh
  • Bạn phải lên kế hoạch rất kĩ lưỡng cho cấu trúc app
  • Phần lớn các SPA đều khá kén SEO trừ khi bạn có áp dụng server-side rendering vốn không phải là chuyện nhỏ

Nhưng SPA cũng có rất nhiều lợi ích cho End-User:

  • Thời gian loading ngắn hơn. SPA .
  • Ajax request thêm data và update cho hệ tương tác người dùng. Trong khi, website truyền thống phải reload mọi thứ cứ sau mỗi lần click.
  • App của bạn xử lí nhanh hơn. Khi user làm bất cứ hành động nào, app sẽ ngay lập tức update. Trong một số trường hợp, bạn sẽ phải áp dụng một spinner để giúp user hiểu rằng app đang xử lí và phản ứng lại yêu cầu của user.
  • Frontend và backend hoàn toàn cách biệt nhau nên bảo trì app trở nên dễ hơn..
  • Giúp các frontend developer phát triển và tích lũy kinh nghiệm

Câu hỏi được đặt ra lúc này là khi nào thì ta nên dùng SPA?

Nếu website của bạn rất đơn giản, ví dụ như chỉ cần hiện thị thông tin và bạn cần SEO để tăng lượt vào xem thì SPA là không cần thiết bởi WordPress website là đủ rồi. Khi tạo ra blog của mình, tôi đắn đo giữa React hoặc WordPress và cuối cùng thì chọn WordPress bởi dù sao thì blog cũng khá đơn giản. Chỉ cần cài một cái theme là đã có ngay rồi.

Về SPA, hãy tự hỏi bản thân: Lần cuối cùng mà bạn xài Gmail classic (phiên bản chậm chạp của gmail) là khi nào? Từng click đều khá đắt giá. Và nó mất tới vài giây chỉ để reload lại toàn bộ website.

Như vậy, nếu website của bạn có nhiều tương tác khác nhau thì SPA là một lựa chọn tuyệt vời. Có rất nhiều ứng dụng từ SPA: chat app, CRM, online file manager, travel planning… Vì thế mà bạn phải dùng đúng loại tool tùy vào tình huống. Đã là 2017 nên các tool lập trình SPA đã được cải thiện. Cá nhân tôi vẫn thích lập trình app bằng React và AngularJS. Sau đây là một số nguyên nhân tôi thích React:

  • Mọi thứ trên màn hình của bạn đều là component. Mà Components thì dễ phát triển và bảo trì.
  • Bạn có thể tránh được việc CSS bị xung đột với style libraries như StyledComponent hoặc CSSModules
  • Hot reloading giúp bạn update app mà không cần reload nó lại.
  • GraphQL là một công cụ thần thánh cho data fetching, tôi tin nó sẽ thay thế REST.
  • Javascript càng ngày mạnh mẽ hơn trong những năm gần đây. ES6 và ES7 giúp cải thiện hiệu năng làm việc của các developer hơn.

Nếu lần sau, có ai hỏi bạn về SPA thì hãy giải thích cho họ lúc nào thích hợp nên xài SPA cũng như những app nào thì nên dùng tới SPA.

Nguồn: blog.topdev.vn via Nam Tran via Codecamp

Cách thức hoạt động của JavaScript: V8 engine và 5 mẹo tối ưu hóa

Bài này sẽ đi sâu vào các phần V8 JavaScript engine của Google. Tôi sẽ cung cấp một số mẹo nhỏ về cách viết code JavaScript tốt hơn – đạt hiệu suất hơn mà nhóm phát triển của chúng tôi tại SessionStack thực hiện khi xây dựng sản phẩm.

Tổng quan

Một JavaScript engine là chương trình hoặc là interpreter (trình thông dịch) thực thi code JavaScript. Một JavaScript engine có thể được thực hiện như một trình thông dịch tiêu chuẩn, hoặc compiler (trình biên dịch) phù hợp để biên dịch JavaScript thành bytecode trong một số hình thức.

Đây là danh sách các dự án phổ biến đang triển khai JavaScript engine:

  • V8 — mã nguồn mở, được phát triển bởi Google, viết bằng C ++
  • Rhino — Được quản lý bởi Mozilla, mã nguồn mở được phát triển hoàn toàn bằng Java
  • SpiderMonkey — Công cụ JavaScript đầu tiên, được sự hỗ trợ của Netscape Navigator, và ngày hôm nay thuộc quyền sử dụng của Firefox
  • JavaScriptCore — mã nguồn mở, được biết đến là Nitro và do Apple phát triển cho Safari
  • KJS — engine của KDE được phát triển bởi Harri Porten cho trình duyệt web KDEproject’s Konqueror
  • Chakra (JScript9) — Internet Explorer
  • Chakra (JavaScript) — Microsoft Edge
  • Nashorn, mã nguồn mở như là một phần của OpenJDK, được viết bởi Oracle Java Languages và Tool Group
  • JerryScript —Là một công cụ nhẹ cho Internet of Things.

Tại sao V8 Engine được tạo ra?

V8 Engine được xây dựng bởi Google là mã nguồn mở và được viết bằng C ++. Công cụ này được sử dụng trong Google Chrome. Tuy nhiên, khác với phần còn lại của engine, V8 cũng được sử dụng phổ biến cho Node.js.

V8 lần đầu tiên được thiết kế để tăng hiệu suất việc thực hiện JavaScript bên trong các trình duyệt web. Để tối ưu hóa tốc độ, V8 chuyển code JavaScript thành machine code thay vì sử dụng một interpreter. Nó biên dịch code JavaScript vào machine code khi thi hành bằng cách sử dụng trình biên dịch JIT (Just-In-Time) như rất nhiều công cụ JavaScript hiện đại như SpiderMonkey hay Rhino (Mozilla). Sự khác biệt chính ở đây là V8 không tạo ra code bytecode hoặc bất kỳ code trung gian nào.

Tham khảo thông tin tuyển dụng JavaScript Hồ Chí Minh dành cho bạn!

V8 từng có 2 trình biên dịch

Trước khi phiên bản 5.9 của V8 xuất hiện (phát hành đầu năm nay), engine đã sử dụng hai trình biên dịch:

  • full-codegen  – một trình biên dịch đơn giản và tạo ra code đơn giản và tương đối chậm.
  • Crankshaft  – trình biên dịch phức tạp hơn (Just-In-Time) tối ưu hóa việc tạo racode hiệu quả hơn.

V8 Engine cũng sử dụng một số threads internally:

  • thread chính thực hiện những gì bạn đang mong đợi: lấy code của bạn, biên dịch nó và sau đó thực hiện nó
  • Ngoài ra còn có một luồng riêng biệt để biên soạn, do đó các luồng chính có thể tiếp tục thực hiện trong khi tối ưu hóa code
  • Một luồng Profiler sẽ cho biết thời gian chạy trên các methods mà chúng ta dành nhiều thời gian để Crankshaft để có thể tối ưu hóa chúng
  • Một vài luồng để xử lý quét Garbage Collector

Khi thực hiện code JavaScript lần đầu tiên, V8 thúc đẩy full-codegen trực tiếp chuyển code Javascript thành machine code mà không cần chuyển đổi. Điều này cho phép nó bắt đầu thực hiện machine code rất nhanh. Lưu ý rằng V8 không sử dụng bytecode trung gian bằng cách này loại bỏ sự cần thiết của interpreter

Khi code của bạn đã chạy một thời gian, luồng profiler đã tập hợp đủ dữ liệu để cho biết phương pháp nào nên được tối ưu hóa.

Tiếp theo, tối ưu hóa Crankshaft được thực hiện ở 1 luồng khác. Mục đích để dịch cú pháp JavaScript thành single-assignment (SSA) được gọi là Hydrogen và cố gắng tối ưu hóa đồ thị Hydro. Hầu hết các tối ưu hóa được thực hiện ở mức này.

Inlining

Tối ưu hóa đầu tiên là inlining càng nhiều code càng tốt. Inlining là quá trình thay thế một call site (dòng code nơi chức năng được gọi) với phần thân của hàm được gọi. Bước này cho phép tối ưu hóa sau có ý nghĩa hơn.

Hidden class

JavaScript là một ngôn ngữ dựa trên nguyên mẫu: không có các class và các object được tạo ra bằng cách sử dụng quá trình nhân bản. JavaScript cũng là một ngôn ngữ lập trình động, có nghĩa là các thuộc tính có thể dễ dàng thêm hoặc xoá khỏi một object sau khi nó được khởi tạo.

Hầu hết các trình biên dịch JavaScript sử dụng các cấu trúc giống như từ điển (dựa trên chức năng hash) để lưu trữ vị trí các giá trị thuộc tính đối tượng trong bộ nhớ. Cấu trúc này làm cho việc lấy giá trị của một thuộc tính trong JavaScript phức tạp hơn nhiều so với các ngôn ngữ lập trình non-dynamic như: Java hay C #. Trong Java, tất cả các thuộc tính của đối tượng được xác định bởi một bố cục cố định trước khi biên dịch và không thể tự động thêm hoặc xoá khi chạy. Kết quả là các giá trị thuộc tính (hoặc các trỏ tới các thuộc tính đó) có thể được lưu trữ dưới dạng một bộ nhớ đệm bổ sung liên tục. Độ dài của offset có thể dễ dàng được xác định dựa trên loại thuộc tính, trong khi điều này là không thể trong JavaScript khi mà chương trình đang chạy.

Vì sử dụng dictionaries để tìm vị trí của các thuộc tính đối tượng trong bộ nhớ là rất không hiệu quả, V8 sử dụng một phương pháp khác thay thế: hidden classes. Các hidden classes có chức năng tương tự như object layout, ( class) được sử dụng như trong Java ngoại trừ các class được tạo ra trong thời gian chạy. Bây giờ, chúng ta hãy xem những gì nó thực sự như thế nào:

function Point(x, y) {
    this.x = x;
    this.y = y;
}
var p1 = new Point(1, 2);

Khi “invocation Point (1, 2)” mới xảy ra, V8 sẽ tạo ra một hidden classes gọi là “C0”.

Không có thuộc tính nào được xác định cho Point, vì vậy “C0” trống.

Khi câu lệnh đầu tiên “this.x = x” được thực hiện (bên trong hàm “Point”), V8 sẽ tạo ra một hidden classes thứ nhì gọi là “C1” dựa trên “C0”. “C1” mô tả vị trí trong bộ nhớ (tương đối so với con trỏ đối tượng) nơi có thể tìm thấy thuộc tính x. Trong trường hợp này, “x” được lưu trữ tại offset 0, có nghĩa là khi xem một đối tượng điểm trong bộ nhớ như một bộ đệm liên tục, lần bù đầu tiên sẽ tương ứng với thuộc tính “x”. V8 sẽ cập nhật “C0” với một “class transition” trong đó nếu một thuộc tính “x” được thêm vào một đối tượng điểm, nên hidden classes chuyển từ “C0” thành “C1”. Hidden classes cho đối tượng bên dưới bây giờ là “C1”.

Quá trình này được lặp lại khi câu lệnh “this.y = y” được thực hiện (một lần nữa, bên trong chức năng Point, sau câu lệnh “this.x = x”).

Một hidden classes mới được gọi là “C2” được tạo ra, sự chuyển đổi class được thêm vào “C1” cho biết nếu một thuộc tính “y” được thêm vào một đối tượng Point (đã chứa thuộc tính “x”), thì hidden classes sẽ thay đổi thành “C2”, và hidden classes của đối tượng được cập nhật thành “C2”.

Các chuyển tiếp hidden classes phụ thuộc vào thứ tự thuộc tính được thêm vào một đối tượng. Hãy xem đoạn code dưới đây:

function Point(x, y) {
    this.x = x;
    this.y = y;
}
var p1 = new Point(1, 2);
p1.a = 5;
p1.b = 6;
var p2 = new Point(3, 4);
p2.b = 7;
p2.a = 8;

Bây giờ, bạn sẽ giả định rằng đối với cả p1 và p2 thì các hidden classes và transitions sẽ được sử dụng. Vâng, không thực sự. Đối với “p1”, đầu tiên thuộc tính “a” sẽ được thêm vào và thuộc tính “b”. Tuy nhiên, đối với “p2”,  đầu tiên “b” đang được chỉ định, tiếp theo là “a”. Do đó, “p1” và “p2” kết thúc với các hidden classes khác nhau do kết quả của các transitions khác nhau. Trong những trường hợp này, tốt hơn là nên khởi tạo các thuộc tính động theo cùng thứ tự sao cho các hidden classes có thể được sử dụng lại.

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

Inline caching

V8 tận dụng lợi thế kỹ thuật khác để tối ưu hóa các ngôn ngữ đánh máy được gọi là inline caching. Inline caching dựa trên quan sát rằng các repeated calls lặp lại với cùng một phương pháp có xu hướng xảy ra trên cùng một loại đối tượng. Một giải thích sâu về Inline caching có thể được tìm thấy ở đây.

Chúng ta sẽ tiếp xúc với khái niệm chung về inline caching (trong trường hợp bạn không có thời gian để tìm hiểu sâu hơn).

Làm thế nào nó hoạt động? V8 duy trì một bộ nhớ cache của loại đối tượng đã được truyền như là một tham số trong các calls gần nhất và sử dụng thông tin này để tạo ra một giả định về loại đối tượng sẽ được truyền như một tham số trong tương lai. Nếu V8 có thể tạo ra một giả định tốt về loại đối tượng nó có thể bỏ qua quá trình tìm ra cách truy cập các thuộc tính của đối tượng, và thay vào đó, sử dụng các thông tin được lưu trữ từ các tra cứu trước đó tới đối tượng trong các hidden classes.

Vậy các khái niệm về hidden classes và inline caching có liên quan như thế nào? Bất cứ khi nào một phương thức được gọi trên một đối tượng cụ thể, V8 phải thực hiện một tra cứu đến hidden classes của đối tượng đó để xác định độ offset cho việc truy cập một thuộc tính cụ thể. Sau hai call thành công của cùng phương pháp đến cùng một hidden classes, V8 bỏ qua việc tra cứu hidden classes và đơn giản chỉ thêm offset vào chính con trỏ của đối tượng. Đối với tất cả các call trong tương lai của phương pháp đó,  V8 giả định rằng hidden classes không thay đổi và nhảy trực tiếp vào địa chỉ bộ nhớ cho một thuộc tính cụ thể bằng cách sử dụng các hiệu số được lưu trữ từ các tra cứu trước đó. Điều này làm tăng tốc độ thực hiện.

Đây cũng là lý do tại sao Inline caching quan trọng đến nỗi các đối tượng cùng loại chia sẻ các hidden classes. Nếu bạn tạo hai đối tượng cùng loại và với các hidden classes khác nhau (như chúng ta đã làm trong ví dụ trước đó), V8 sẽ không thể sử dụng bộ nhớ đệm nội tuyến bởi vì mặc dù hai đối tượng cùng loại, các lớp ẩn tương ứng của chúng Gán các hiệu số khác nhau cho thuộc tính của chúng.

Biên soạn machine code

Một khi biểu đồ Hydrogen được tối ưu, Crankshaft giảm nó xuống mức thấp hơn là Lithium. Hầu hết việc thực hiện Lithium là kiến trúc cụ thể. Đăng ký phân bổ sẽ xảy ra ở giai đoạn này.

Cuối cùng, Lithium được biên dịch thành machine code. Sau đó, cái được gọi là OSR: on-stack thay thế. Trước khi chúng tôi bắt đầu biên dịch và tối ưu hoá một phương pháp chạy lâu dài, chúng tôi có thể chạy nó. V8 sẽ không quên những gì nó đã thực hiện và chỉ thực sự bắt đầu lại với phiên bản được tối ưu hóa. Nó sẽ chuyển đổi tất cả những gì chúng ta có (stack, register) để có thể chuyển sang phiên bản được tối ưu hóa ở giữa thực thi. Đây là một nhiệm vụ rất phức tạp, lưu ý rằng trong số các tối ưu hóa khác, V8 đã inlined code ban đầu V8 không phải là engine  duy nhất có khả năng làm việc đó.

Có những biện pháp bảo vệ được gọi là khước từ để thực hiện việc chuyển đổi ngược lại và quay trở lại code không được tối ưu hoá trong trường hợp giả định rằng engine đã thực hiện không còn đúng nữa.

Tổng hợp file rác

Để tổng hợp file rác, V8 sử dụng cách tiếp cận thế hệ tiếp theo bằng việc đánh dấu và quét để làm sạch thế hệ cũ. Giai đoạn đánh dấu là để kết thúc việc thực hiện JavaScript. Để kiểm soát chi phí của GC và làm cho việc thực hiện ổn định hơn, V8 sử dụng đánh dấu thay vì đi bộ toàn bộ đống, cố gắng đánh dấu mọi đối tượng có thể, nó chỉ đánh dầu một phần của hệ thống, sau đó khôi phục lại việc thực hiện bình thường. GC tiếp theo sẽ tiếp tục đi đến các heap trước khi dừng lại. Điều này cho phép tạm dừng rất ngắn so với quá trình thực hiện bình thường. Như đã đề cập ở trên, giai đoạn quét được xử lý bởi các luồng riêng biệt.

Ignition và TurboFan

Với việc phát hành V8 5.9 sớm hơn vào năm 2017, một đường dẫn thực hiện mới đã được giới thiệu. Đường dẫn mới này đạt được những cải tiến về hiệu năng lớn hơn và tiết kiệm đáng kể bộ nhớ trong các ứng dụng JavaScript thực.

Các đường dẫn thực hiện mới được xây dựng trên đầu trang của Ignition, V8’s interpreter, và TurboFan, trình biên dịch tối ưu hóa mới nhất của V8.

Bạn có thể kiểm tra bài đăng blog từ nhóm V8 về chủ đề ở đây.

Kể từ phiên bản 5.9 của V8 ra đời, phiên bản Vende và Crankshaft (công nghệ đã phục vụ V8 từ năm 2010) đã không còn được sử dụng bởi V8 vì việc thực hiện JavaScript vì V8 đã phải vật lộn để theo kịp các tính năng ngôn ngữ JavaScript mới và cac tối ưu hóa cần thiết cho các tính năng này.

Điều này có nghĩa là V8 tổng thể sẽ có kiến trúc đơn giản hơn và có thể duy trì được nhiều kiến trúc hơn nữa.

Những cải tiến này mới chỉ là sự khởi đầu. Ignition và TurboFan mở đường cho những tối ưu hóa tiếp theo sẽ làm tăng hiệu suất của JavaScript và giảm dấu chân của V8 trong cả Chrome và Node.js trong những năm tới.

Cuối cùng, đây là một số mẹo và thủ thuật về cách viết tốt nhất, tối ưu hóa, JavaScript tốt hơn. Nó được bắt nguồn từ nội dung ở trên, tuy nhiên, đây là một bản tóm tắt ngắn gọn hơn.

Làm thế nào để viết JavaScript tối ưu hóa

  1. Thứ tự các thuộc tính của đối tượng: Các thuộc tính đối tượng của bạn được sắp xếp theo thứ tự nhất định để các hidden classes, tối ưu hóa code, có thể được chia sẻ.
  2.  Thuộc tính dynamic: Thêm vào một đối tượng sau khi instantiation sẽ buộc phải thay đổi một hidden classes sẽ làm chậm bất kỳ phương pháp đã được tối ưu hóa cho lớp ẩn trước đó. Thay vào đó, gán tất cả thuộc tính của đối tượng trong hàm tạo của nó.
  3. Các method: code thực hiện cùng một phương pháp lặp đi lặp lại sẽ chạy nhanh hơn code thực hiện nhiều phương pháp khác nhau chỉ một lần (do Inline caching).
  4. Arrays: Tránh các mảng rời rạc mà các phím không phải là các số tăng dần. Mảng rời rạc không có các phần tử bên trong là các hash table. Các yếu tố trong các mảng như vậy dễ truy cập hơn. Ngoài ra, cố gắng tránh phân bổ mảng lớn. Nó tốt hơn để phát triển. Cuối cùng, không xóa các phần tử trong mảng. Nó làm cho các phím thưa thớt.
  5. Tagged values: V8 đại diện cho các đối tượng và số với 32 bit. Nó sử dụng một chút để biết nếu nó là một đối tượng (flag = 1) hoặc một số nguyên (flag = 0) gọi là SMI (SMall Integer) vì 31 bit của nó. Sau đó, nếu một giá trị số lớn hơn 31 bit, V8 sẽ trở thành hộp số, biến nó thành một đôi và tạo ra một đối tượng mới để đưa số vào bên trong. Hãy thử sử dụng 31 bit ký số bất cứ khi nào có thể để tránh các hoạt động boxing vào một đối tượng JS.

Từ thực tiễn công việc của chúng tôi tại SessionStack thực hiện theo những cách này để viết code JavaScript tối ưu hóa cao. Lý do là khi bạn tích hợp SessionStack vào ứng dụng web của mình, nó bắt đầu ghi lại mọi thứ: thay đổi DOM , UI, JavaScript exceptions, stack traces, failed network requests, và debug messages.

Với SessionStack, bạn có thể reply các vấn đề trong ứng dụng web của mình dưới dạng video và xem mọi thứ đã xảy ra với người dùng của bạn. Và tất cả điều này xảy ra mà không ảnh hưởng đến hiệu suất ứng dụng web của bạn.

Có một kế hoạch cho phép bạn bắt đầu miễn phí.

Nguồn: Techtalk via Sessionstack

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

Các CEO hàng đầu nước Mỹ tiết lộ điều cần làm ở tuổi 20 để có sự nghiệp thành công

Nếu bạn muốn điều hành một đế chế kinh doanh một ngày nào đó, bạn cần phải bắt đầu xây dựng một nền tảng sự nghiệp thành công cho chính mình rất sớm.

Dưới đây là chia sẻ về bí quyết thành công từ độ tuổi 20 của các CEO (giám đốc điều hành) đương nhiệm cũng như các cựu CEO của các doanh nghiệp nằm trong Top Fortune 500 tại Mỹ.

CEO Oath Tim Armstrong khuyên các con sống luôn đúng với bản thân và thành thật với người khác.

Các CEO hàng đầu nước Mỹ tiết lộ điều cần làm ở tuổi 20 để có sự nghiệp thành công - Ảnh 1.

Tim Armstrong, CEO của Oath, người phụ trách Yahoo và AOL dưới trướng Verizon. Trước khi làm việc tại Oath và AOL, Armstrong từng là một lãnh đạo cấp cao tại Google. Ảnh: Scott Legato/Getty.

Tim Armstrong luôn đề cao sự thành thật với bản thân và những người xung quanh.

Ông cũng xây dựng một đội ngũ cố vấn từ 5-8 người không làm việc trong công ty để nghe họ chỉ ra những sai lầm và cho ông lời khuyên từ họ. Đó là các ông nhìn nhận một cách trung thực nhất về bản thân và dám đối mặt với những sai lầm để khắc phục ngay lập tức. Cách làm này cũng được ông khuyến khích đội ngũ nhân viên, đặc biệt là nhân viên trẻ làm theo.

John Sculley, cựu CEO và Chủ tịch của Pepsi, nói rằng hãy luôn suy nghĩ giống như một doanh nhân và luôn tìm kiếm một cách tốt hơn để làm việc.

Các CEO hàng đầu nước Mỹ tiết lộ điều cần làm ở tuổi 20 để có sự nghiệp thành công - Ảnh 2.

Ảnh: Stringer/Getty

John Sculley cho biết ông vẫn luôn là một người rất tò mò. Dù làm việc trong các nhà máy đóng chai, đặt lại kệ ở siêu thị, mua bán, nói chuyện với các nhà máy đóng chai khác của Pepsi ông vẫn luôn quan sát, suy nghĩ, đặt câu hỏi “tại sao nó lại được thực hiện theo cách này?”.

“Tôi nghĩ rằng mặc dù tôi không biết nhiều về từ “doanh nhân” vào thời điểm đó, nhưng tôi biết chính xác những đặc điểm mà tôi cần tìm kiếm để trở thành một doanh nhân thực sự giỏi để lãnh đạo công ty”, ông nói. Thực tế, bạn cần có một tư duy ham học hỏi, và luôn tìm kiếm những cách tốt hơn để làm điều gì đó, và bây giờ với công nghệ hiện đại giúp biến mọi thứ thành có thể, bạn càng cần phải tìm ra cách làm thế nào để chúng ta có thể biến mọi thứ thành có thể.

Và trên hết, để làm tốt bất cứ điều gì, tất cả cần bắt đầu với một niềm đam mê, tìm ra cách giải quyết một vấn đề theo cách mà chưa bao giờ được giải quyết trước đó, và chỉ có một nền tảng đạo đức tốt thì mới có thể duy trì được điều đó liên tục.

Drew Houston, CEO Dropbox, người đã xây dựng được công ty trị giá 10 tỷ USD ở độ tuổi 20, cho rằng sẽ không bao giờ là quá sớm để bắt đầu và bạn nên biết mình muốn làm gì trong 5 năm nữa.

Các CEO hàng đầu nước Mỹ tiết lộ điều cần làm ở tuổi 20 để có sự nghiệp thành công - Ảnh 3.

 Ảnh: Business Insider

Drew Houston cho rằng những ai muốn thành công thì nên bắt đầu khởi nghiệp từ sớm và không ngừng tự đặt ra câu hỏi: Một, hai hay năm năm sau mình sẽ học được những gì và làm được những gì? Bởi theo vị CEO trẻ này:

Thứ nhất, không ai sinh ra đã là một CEO. Đây là một vị trí cần phải có nhiều thời gian và trải nghiệm mới đạt được.

Thứ hai, tất cả mọi thứ đều phải học. “Tôi bắt đầu chỉ là một người thiên về mặt kỹ thuật. Tôi không có kinh nghiệm kinh doanh thực sự. Tôi đã phải tìm kiếm trên Amazon các cụm từ “bán hàng”, “tiếp thị” hoặc “chiến lược” và chỉ mua những cuốn sách được đánh giá cao nhất liên quan đến các từ khóa này để đọc”, Drew Houston cho biết.

Drew Houston cũng cho rằng, mọi người nên đặt tầm nhìn cao hơn về những gì muốn làm, nhưng đồng thời cũng phải kiên nhẫn. “Nó giống như chơi nhạc cụ. Bạn sẽ không bỗng chốc trở thành người nổi tiếng hay sẽ không thể cải thiện kỹ năng chỉ trong ngày một ngày hai mà phải mất nhiều năm. Ít nhất là trong năm năm sau, bạn sẽ thực sự ngạc nhiên về mức độ bạn cải thiện của bản thân”, Drew Houston nói.

Sheryl Sandberg, COO (Giám đốc vận hành) của Facebook nói rằng điều quan trọng là phải chấp nhận rủi ro và tìm một công ty có khả năng phát triển như một con tàu tên lửa.

Các CEO hàng đầu nước Mỹ tiết lộ điều cần làm ở tuổi 20 để có sự nghiệp thành công - Ảnh 4.

Ảnh: Richard Drew/AP

Sheryl Sandberg cho rằng, một điều đáng để suy nghĩ là nếu bạn ở độ tuổi 20 và đặc biệt bạn là phụ nữ bạn nên tham gia vào cộng đồng “Lean In”. Hiện cộng đồng này có 33.000 thành viên trên khắp thế giới và mỗi tuần có thêm khoảng 100 người gia nhập. Cộng đồng này sẽ giúp cung cấp cho phụ nữ một tầm nhìn rõ ràng về mục tiêu của họ và để các thành viên hỗ trợ lẫn nhau.

Bản thân Sheryl Sandberg cũng là một thành viên của cộng đồng này và bà cho biết sẽ góp phần hỗ trợ những người phụ nữ khác có thể theo đuổi công việc mà họ yêu thích cũng như tạo cho họ những công việc rõ ràng. Theo bà, với phụ nữ, ước mơ lớn là điều thực sự quan trọng.

Steve Ballmer, cựu CEO Microsoft nói rằng hãy tìm ra một điều gì đó bạn đam mê – điều mà có thể làm cho bạn muốn sống để làm việc.

Các CEO hàng đầu nước Mỹ tiết lộ điều cần làm ở tuổi 20 để có sự nghiệp thành công - Ảnh 5.

 Ảnh: Mike Windle/Getty

Thứ nhất, Steve Ballmer cho rằng điều quan trọng nhất để thành công là tìm ra được đam mê của bản thân. “Con trai tôi nói với tôi điều này: “Bố, có những người sống để làm việc và có những người làm việc để sống. Và tôi tôn trọng cả hai kiểu người điều đó. Nhưng nếu bạn đang cố gắng để có được một sự nghiệp, bạn sẽ có một chút động lực sống để làm việc hơn khi bạn làm việc để sống. Vì vậy, điều quan trọng nhất vẫn là đam mê”, ông nói.

Thứ hai, khi thực hiện một công việc khó khăn, suy nghĩ và tư duy tốt là điều then chốt nhưng cũng cũng cần phải có may mắn. “Tôi biết Microsoft là một công ty tài năng. Chúng tôi có những người rất tài năng. Tôi chắc chắn nhận thấy tôi đã làm việc chăm chỉ và có một số ý tưởng tốt, cũng như Bill Gates và Paul Allen. Nhưng nếu ai nói rằng may mắn không liên quan đến thành công của chúng tôi thì tôi phủ nhận. Rõ ràng chúng tôi đã gặp một số may mắn”, ông cho biết thêm.

Dan Schulman, CEO PayPal nói rằng không ai thay thế cho bạn khi công việc khó khăn nhưng bạn sẽ thành công hơn nếu có các đồng nghiệp luôn ở bên cạnh và được bạn tán dương về thành tích của họ.

Các CEO hàng đầu nước Mỹ tiết lộ điều cần làm ở tuổi 20 để có sự nghiệp thành công - Ảnh 6.

 Ảnh: AP

Dan Schulman cho biết khi ông khởi đầu sự nghiệp tại AT & T, gia đình ông đã gặp một bi kịch. Khi đó chị gái ông mất và ông vẫn phải dẫn dắt một đội ngũ nhân viên lớn. Ông đã phải mất một khoảng thời gian rất khó khăn để vượt qua. Tuy nhiên, khi tôi trở lại, ông nhận ra rằng nhân viên của ông đã thực sự luôn ở bên cạnh ông, và ông nhận ra rằng những gì mà cả đội ngũ đã hoàn thành là hoàn toàn dựa vào những gì họ đã làm. Ngay sau đó, ông đã không ngần ngại thưởng lớn cho họ.

“Tôi nghĩ rằng những gì tôi học được ở đó là tạo ra sự tín nhiệm để ngày càng thu hút những người khác gia nhập vào đội ngũ của mình bởi vì họ thực sự muốn là một phần của đội và họ biết rằng đó là một đội ngũ sẽ làm việc cùng nhau – không một ai ra đi. Để cố gắng lấy tín được sự tín nhiệm của người khác, các nhà lãnh đạo có nhiều cách, nhưng quan trọng là phải có tầm nhìn thực tế và tạo được niềm hy vọng. Nếu bạn có những nhân viên tuyệt vời xung quanh bạn và họ biết rằng những gì họ làm sẽ được công nhận, thì bạn có thể tạo nên một tập thể cực kỳ mạnh mẽ”, ông nói.

3 sai lầm các iOS Developers thường mắc phải

3 sai lầm các iOS Developers thường mắc phải

Lập trình ra một  iOS app vốn là điều không hề dễ dàng, vì thế cũng dễ hiểu các developer luôn muốn rút gọn các bước để có thể hoàn thành chúng một cách nhanh chóng. Nhưng một app thành công thì sẽ tồn tại một thời gian dài – nói cách khác, các developer vẫn phải fix bug, cải thiện tính năng và code nhiều nữa.

Trong bài viết này, tôi sẽ nói về 3 điều mà các iOS developer nên biết để giúp cho quá trình được gọn gàng và nhanh chóng hơn.

200+ cơ hội code iOS hấp dẫn đang chờ bạn gõ cửa

Đừng xem thường Constants (Hằng số)

Khá nhiều người tin rằng variables luôn tốt hơn constants bởi sự linh hoạt của nó, thế nhưng nếu có cơ hội thì bạn hãy ưu tiên sử dụng constants trước. Tại sao lại thế? Đó là bởi một số lợi ích của nó:

Dễ đọc

Một trong những điều tuyệt với nhất của constants là chúng rất dễ đọc. Hãy thử với một ví dụ sau: bạn cần phải viết một app về kinh doanh. Bạn cần phải thêm tỉ lệ mức thuế ở 8.75%, nhưng khi các developer vào xem thì họ sẽ không hiểu con số trên là gì.

Giả sử có một Developer tên là Trung, Trung tham gia vào team của bạn và đọc code của app. Do ở nước của Trung không hề có khái niệm gì về thuế nên Trung chả hiểu còn số 8.75% có vai trò như thế nào.

Do đó nếu bạn để giá trị của thuế là một variable  thì rất có thể Trung do vô tình không biết và tự ý sửa thì nó có khả năng gây ra hậu quả nghiêm trọng. Chỉ cần thay đổi keyword từ  var thành let thì compiler sẽ thông báo cho Trung biết rằng giá trị 8.75% là không thay đổi được và anh sẽ hiểu rằng đó là chủ ý của bạn khi không muốn nó bị đụng vào.

Giá trị tham khảo

let khá tiện lợi khi cho phép bạn ám chỉ một giá trị nhất định. Thí dụ như bạn muốn sơn một màu bất kì. Thay vì cứ phải Copy-paste lại từng cái thì với constant, bạn chỉ việc đơn giản là nói ra màu mình muốn sơn là gì.

Nhờ đó mà khi bạn muốn thay màu sơn, thì chỉ cần thay đổi giá trị của constant và chúng sẽ tự động cập nhật.

Class hay Struct Instantiation

Khi bạn tạo ra một singleton, thì ta cũng phải đụng tới class. Thông thường, bạn sẽ phải khai báo  static let trong class declaration. Sau đó bạn phải đặt tên cho constant và chỉ định nó tới một class và dùng xuyên suốt app.

Mặt khác, nếu bạn muốn tạo ra một class nhanh chóng, với ViewController.swift, bạn sẽ tạo ra constant và chỉ định nó tới class bạn muốn, với một giá trị tham khảo, quá trình trên sẽ diễn ra nhanh chóng.

Có thể thấy, sử dụng constant cho ta rất nhiều lợi ích. Chúng giúp code dễ đọc hơn, để lưu trữ các giá trị bất biến, và không hề vô dụng như bạn đã nghỉ.

Đừng mở Optionals sai cách

Optionals là những tính năng rất mạnh mẽ của Swift. Chúng đều là những types như  int và String, được chú thích bởi dấu chấm hỏi sau type declaration. Nếu bạn muốn khai báo một variable là optional string, bạn sẽ viết như sau:

var someVariable: String?

Compiler lúc này sẽ tự hiểu rằng hoặc nó có giá trị hoặc là không. String? và String là hoàn toàn khác nhau.

Optionals cũng như những hộp quà vậy, chúng có thể chứa những món quà giá trị hoặc không có gì cả. Để biết được chúng có gì ta sẽ phải mở những hộp quà đó ra.  

Cách sai

“Cố xé” nó ra

Hành động đó còn được gọi là Bang Operator. Đừng có xài nó! Việc cố mở một variables chẳng bao là ý tưởng tốt cả. Nếu giá trị của một value bạn đang cố mở là nil (không có giá trị), thì ngay lập tức app sẽ crash. Hãy thử nhìn vào dòng code sau đây:

var someVariable: String?
var somethingElse: String = "hello"
 
func setupApp() {
    self.somethingElse = self.someVariable!
}

Trong trường hợp trên, app sẽ crash bởi ta chưa hề defined được một giá trị cho  someVariable, và ta cũng đang muốn chỉ định nó đến một variable của một loại  String. Như vậy nó khiến cho optionals bị mất đi ý nghĩa bởi nó vốn là để giúp chúng ta không bị những trường hợp này.

Vậy chúng ta hãy nhìn vào cách làm đúng trong tình huống trên:

Cách đúng

Optional Binding
Đây là một trong những cách thức phổ biến nhất dành cho optionals. Với cách này, bạn chỉ cần chỉ định một giá trị optional đến constant bằng `if`. Nếu optional có thể mở thì compiler se được đóng, và lúc đó bạn có thể dùng constant đã được tạo ra. Còn nếu không thì tức là bạn đã ở trong trường hợp `else` và sẽ chả có gì xảy ra.

 

var someVariable: String?
var somethingElse: String = "hello"
 
func setupApp() {
    if let theThing = someVariable {
        self.somethingElse = self.someVariable!
    } else {
        print("error")
    }
}

Dựa theo ví dụ lúc nãy, nhưng với optional binding. Thay vì bị crash thì compiler chỉ thông báo là “error” hay lỗi.

Optional Chaining

Một cách thông dụng khác là Optional Chaining. Đây là một phương pháp khá hay để tránh việc optional không có giá trị mà lại khá ngắn với chỉ một dòng code. Bởi khi đó nó sẽ ngay lập tức ngừng execute.

 

var someClass: SomeClass? = SomeClass()
var somethingElse: String?
 
func setupApp() {
    self.somethingElse = someClass?.createString()
}

Hiểu một cách đơn giản thì nếu someClass có giá trị là nil thì cả dòng code đó sẽ bị bỏ qua và giá trị của  somethingElse sẽ là nil. Còn nếu có giá trị thật thì nó như bên optional binding, sẽ được chỉ đạo đến variable  somethingElse và tất nhiên là app không bị crash.

Nil Coalescing

Tương tự như Optional Chaining bởi nó khá ngắn gọn nhưng bạn phải cung cấp default  hoặc cách xử lí cho tình huống “else”:

var someVariable: String?
var somethingElse: String = "hello"
 
func setupApp() {
    self.somethingElse = someVariable ?? "error"
}

 

Nhìn thì có vẻ khá thần bí nhưng nó chỉ đơn giản là nếu statement  ở bên trái có một giá trị, thì sẽ được dùng. Còn nếu là nil thì default statement sẽ được dùng. Cần lưu ý là statement bên phải không được là nil hay optional.

Đừng bỏ qua cấu trúc của code

Một lỗi thường gặp của các developer là không quan tâm bảo đảm sao cho cấu trúc code được bền vững, gọn gàng và dễ bảo trì. Có rất nhiều cứ cố nhồi nhét code vào  ViewController classes, Khiến cho việc thay đổi cũng như debug trở nên khó khăn hơn.

Vì thế mà bạn cần phải có cách thiết kế cấu trúc code thật tốt và luôn theo kĩ từng bước.

Chúng ta có 2 model thường được các iOS developer dùng, đó là:

MVC (Model-View-Controller)

MVC sẽ chia code của bạn thành 3 phần: model, view, controller

  • Model: chính là data của app. Nó bao gồm các reusable structures và class chỉ dành cho data của app. nó không hề có ảnh hưởng hay liên quan tới view hay cách hiển thị thông tin tới người dùng.
  • View: chịu trách nhiệm cho việc hiển thị data cho user và cả user interaction. Không hề liên quan tới việc xử lí data hoặc một số view đặc biệt, nó chỉ là reusable class có thể được dùng nhiều lần mà không cần phải lặp đi lặp lại code.
  • Controller: là sếp sòng. Nó vận chuyển data tới model, rùi gửi tới view để hiển thị lên cho người dùng. ViewController.swift chính là một controller, nó tiếp nhận input và sửa model tùy theo yêu cầu.

Có khá nhiều phiên bản khác nhau như  MVVM MVP. Tuy nhiên cách thức hoạt động thì vẫn tương tự nhau.

Hãy thử tìm hểu một phương pháp cấu trúc khác cũng thông dụng không kém, nó là:

Singletons

Singleton là một instance đơn của một class luôn hiện diện mọi lúc trong bộ nhớ. Vậy khi bạn lập trình ra một app có kết nối với một database. Bạn cần có một nơi để lưu trữ toàn bộ data service connections. Đây chính là lúc singletons tỏa sáng, đoạn code dưới đây sẽ cho bạn cách viết ra một singleton:

 

// Declaration
class DataService {
    static var shared = DataService()
     
    func createUser() {
    }
}
 
// Call-site
DataService.shared.createUser()

Nếu bạn theo đúng những bước trên, app của bạn sẽ dễ bảo trì cũng như viết debug cũng trở nên dễ thở hơn rất nhiều.

Lời kết

Qua bài viết này, chúng ta đã thấy rõ 3 sai lầm các iOS app developer thường mắc phải. Chúng trông có vẻ là cách thức tốt nhưng thực chất chỉ làm mọi thứ rối rắm hơn.

Hãy luôn nhớ rằng, lập trình một app chỉ là một phần của project. Bạn còn phải fix bug, thêm tính năng và chia sẻ code với các developer khác. Hãy luôn dùng constants, đừng áp dụng optional sai và có một model cấu trúc rõ ràng, lập trình app và bảo trì nó sẽ trở nên dễ dàng hơn rất nhiều.

Nguồn: Topdev via Tutsplus

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

Làm sao giải quyết nỗi đau của các nhà tuyển dụng IT?

Làm sao giải quyết nỗi đau của các nhà tuyển dụng IT

Tôi có vài cơ hội được trò chuyện cùng anh Nguyễn Hữu Bình – CEO của Applancer, đơn vị chủ quản Website tuyển dụng lập trình viên TopDev.vn. Mặc dù xuất phát điểm là sinh viên khoa Kế toán Kiểm Toán – trường đại học kinh tế, nhưng niềm đam mê lập trình quá lớn nên phần lớn thời gian anh dành cho nó, và gắn bó với nó đến nay cũng hơn 15 năm. Ấn tượng của tôi về anh là người cởi mở, nhiệt huyết, đam mê và có nhiều trăn trở với ngành lập trình Việt Nam hiện nay.

Với kinh nghiệm hơn 15 năm hoạt động trong ngành lập trình, kinh qua rất nhiều vị trí từ cấp thấp cho tới quản lý cấp cao, anh Bình hiểu khá rõ về góc nhìn của cả 2 đối tượng là lập trình viên cũng như nhà tuyển dụng lập trình.

Theo anh, các nhà tuyển dụng trên thị trường hiện đang làm gì để thu hút các nhân tài về phía công ty của mình?

Một tech event chia sẻ công nghệ đến cộng đồng lập trình là một trong các cách employer branding tốt

Hầu hết các công ty công nghệ hiện nay luôn có xu hướng cạnh tranh nhau về mặt lương bổng để tìm kiếm và mời các lập trình viên giỏi nhất đầu quân vào tổ chức của mình. Họ sẵn sàng chi trả mức lương hấp dẫn, thậm chí là “phá giá” cốt chỉ để thu hút lập trình viên tài năng. Một số các công ty công nghệ sẵn lòng trả mức lương cao hơn so với thị trường và cam kết tăng tới 20% lương cho các ứng viên có 2 năm kinh nghiệm đi kèm với đó là các phúc lợi ưu đãi khác. Điều này cũng xuất phát từ thực tế là chúng ta đang cần đến 350.000 nhân lực IT đến cuối năm 2018 nhưng thị trường hiện tại chỉ mới đáp ứng được 200.000 kĩ sư.

Nhưng, có một vấn đề là cũng như trong thương mại điện tử cạnh tranh về giá là con đường dẫn tới bế tắc.

Anh có thể nói rõ hơn về điểm này? Giải pháp nào sẽ giúp cho các nhà tuyển dụng tránh đi vào lối mòn?

Có một sai lầm mà đa phần nhà tuyển dụng thường mắc phải là không quan tâm tới Employer Branding. Hãy tưởng tượng nó như là một trò chơi câu cá vậy, bạn phải thả thính để thu hút sự chú ý của đàn cá, và sau đó mới thả mồi có móc câu xuống đám thính. Employer Branding chính là việc thả thính, gây sự chú ý, còn việc bạn đăng tuyển chính là hành động thả mồi câu xuống, Employer Branding sẽ giúp cho việc đăng tuyển của bạn đạt hiệu quả.

Nhưng sự thật lương và các phúc lợi xã hội có phải là quan tâm hàng đầu của lập trình viên? Và đâu là những thứ thật sự hấp dẫn các lập trình viên?

Câu trả lời là Không. Trong quá khứ, tôi từng nhiều lần nhảy việc, và điều đầu tiên tôi nghĩ đến khi lựa chọn công ty là công ty có bài toán phù hợp với chuyên môn và sở trường của mình, sau đó đến việc tôi có thể học hỏi hoặc nhận được sự giúp đỡ của chuyên gia từ công ty đó, và cuối cùng mới cân nhắc mức lương và đãi ngộ. Tôi tiếp cận được nhà tuyển dụng thông qua việc họ cử chuyên gia đến chia sẻ tại các sự kiện, họ đưa ra hết mọi thứ liên quan đến công nghệ họ đang theo đuổi.

Điều này cũng hoàn toàn trùng khớp với Báo cáo Lương, Phúc lợi và Xu hướng ngành IT quý 1,2/2017 mà TopDev đã khảo sát trên 5500 ứng viên, 150 nhà tuyển dụng và hơn 70000 dữ liệu việc làm. Theo đó, bài toán giữ chân nhân tài của các doanh nghiệp vẫn còn lắm khó khăn, khi mà có tới 42% lập trình được hỏi muốn nhảy việc: 35% không hài lòng với mức lương hiện tại, trong khi phần còn lại thì không hài lòng với phúc lợi của công ty và sự thiếu hụt những chính sách đào tạo giúp họ có thể nâng cao trình độ chuyên môn.

Từ đây, tôi thấy được cơ hội của mình và cũng không e ngại khi ứng tuyển vì tôi cảm nhận được tinh thần cởi mở của họ, họ cũng xuất hiện khắp nơi trên các công đồng công nghệ, các senior của họ len lỏi khắp nơi bằng các bài blog và các câu trả lời về kỹ thuật cho những lập trình viên đang gặp vấn đề. Đó cũng là một trong những case study hợp khá thành công về employer branding.

Anh có thể cho biết thêm một số cách các nhà tuyển dụng có thể lấy điểm trong mắt ứng viên?

Sự thật là đối với lập trình viên, lương và đãi ngộ chưa phải là yếu tố hàng đầu ảnh hưởng tới quyết định đầu quân vào 1 công ty (tất nhiên nó vẫn là một trong các yếu tố quan trọng) để có thể thu hút được ứng viên, cần tạo niềm tin cho ứng viên, ngay cả khi họ chưa có ý định nghỉ việc… để tuyển được ứng viên tài năng nhà tuyển dụng cần thực hiện một chiến lược tuyển dụng dài hạn, để khi họ muốn nhảy việc, thì công ty bạn chính là nơi họ nghĩ đến đầu tiên. Đảm bảo được nguồn nhân sự, bạn sẽ vẫn phải tốn chi phí nhất định, nhưng rõ ràng nó sẽ phát huy hiệu quả hơn là đợi thiếu người rồi mới vội vàng đăng tuyển.

Đa phần các lập trình viên quan tâm nhiều đến chính sách, môi trường công nghệ và văn hoá công ty

Vậy anh có thể tóm tắt những vấn đề bất cập của việc tuyển dụng trong ngành lập trình là gì?

Hiện nay vấn đề nhân sự trong ngành lập trình vẫn còn tồn tại bất cập khi mà lập trình viên chưa có nhiều thông tin về công nghệ, sản phẩm, văn hóa của doanh nghiệp, trong khi đó doanh nghiệp thì khi thiếu người mới đăng tuyển và than trời vì thiếu nhân lực, còn sinh viên ra trường thiếu việc làm”. Sai lầm lớn nhất khiến nhà tuyển dụng không tìm được ứng viên tài năng, cốt lõi nằm ở khâu xây dựng thương hiệu nhà tuyển dụngEmployer Branding.

Chính vì vậy, chúng tôi không chỉ đơn thuần là việc kết nối giữa nhà tuyển dụng với lập trình viên tài năng mà cá nhân tôi còn mong muốn cung cấp một giải pháp tuyển dụng toàn diện cho doanh nghiệp, hỗ trợ doanh nghiệp tối đa, nhanh chóng tìm được các ứng viên phù hợp. Hiện nay, chúng tôi đang là công ty đầu tiên sử dụng các gói Search CV trong lĩnh vực IT.  Việc cung cấp các gói Search CV phù hợp với nhu cầu tuyển dụng của doanh nghiệp, đi kèm với đó là các hỗ trợ : tư vấn, hỗ trợ dài hạn, Employer Branding. Có thể sẽ phải mất công liên hệ, hỏi thăm, chia sẻ và chăm sóc mối quan hệ với ứng viên tiềm năng một thời gian thì mới có kết quả. Tuy nhiên, trong tương lai đây là một chiến lược đảm bảo nguồn nhân lực IT dài hạn ngay từ hôm nay, sau này bạn sẽ phải tốn nhiều chi phí và công sức hơn trong việc cạnh tranh ứng viên với các doanh nghiệp khác.

Cảm ơn anh về những chia sẻ của mình. Cũng xin chúc mừng TopDev bước vào năm thứ 3, Hy vọng cộng đồng lập trình Topdev sẽ luôn phát triển vững mạnh.