Home Blog Page 147

Lập trình viên có cần biết về UI/UX?

Lập trình viên có cần biết về UI/UX

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

Chúng ta là lập trình viên. Chúng ta bỏ ra bốn, năm năm để học và để hành về những thuật toán, những dữ liệu. Vậy hẳn công việc của chúng ta chỉ có thể là code rồi! Code chạy càng nhanh, càng khoẻ thì càng thành công. Tại sao lại phải quan tâm đến UI/UX cơ chứ? Chẳng phải công ty đã thuê designer rồi sao?

Có thật như thế không?

Đã bao giờ bạn tự nói với mình thế này chưa: “Người dùng thật ngu ngốc, cái nút ở ngay đó mà họ không nhìn thấy”? Hay thế này: “Website load cực nhanh, thực hiện chức năng nào cũng nhanh mà họ kêu hơi lag lag”?

Đã bao giờ bạn nổi khùng lên với đám designer vì hình như “chúng nó” cứ cố ý chơi khăm? Chúng nó cứ làm ra những thiết kế khó code cực kỳ. Chúng nó cứ bắt sửa lại những chỗ mình mất bao công mới code được. Những chỗ ấy sửa rồi cũng chả khác gì ban đầu. Hỡi ôi! Khác gì chuyện cắt tóc của con gái cơ chứ!

Thế nhưng, bạn ạ…

Không phải cứ bạn sử dụng tốt thì người dùng cũng sử dụng tốt. Không phải cứ thiết kế cho dễ code thì sản phẩm cuối sẽ dễ dùng. Thuật toán ghê gớm làm gì nếu người ta phát ngán lên không thèm động vào phần mềm của bạn?

>>> Xem thêm: UI UX là gì? Công việc của một UX/UI designer

Lập trình viên biết UI/UX có lợi gì?

Tất nhiên rồi, bạn sẽ mở lòng hơn với người dùng và designer. Bạn sẽ không đem bực bội ấy ra đường. Bạn sẽ không phải tìm đến “trà đá kem cheese” để giải toả. Và như thế thì tỉ lệ tai nạn giao thông, tỉ lệ tệ nạn xã hội ở Việt Nam sẽ giảm mạnh. Việt Nam sẽ sớm trở thành cường quốc hàng đầu thế giới. Tiếng Việt sẽ sớm là ngôn ngữ duy nhất trên địa cầu.

Đùa thôi! Bạn phải hiểu làm thế nào thì người dùng thấy dễ dùng, thấy thích dùng. Có thế bạn mới làm chủ được sản phẩm, đúng không nào? Có thế thì cái mà bạn code ra mới có ích, có chất lượng được, phải không? Nhờ biết về UI/UX, bạn sẽ phát triển hơn qua từng ngày.

>>> Xem thêm: Bí kíp vượt qua 7 câu hỏi phỏng vấn UI/UX Designer thường gặp

Lập trình viên có cần biết về UI/UX?

Làm sao để nâng cao kỹ năng thiết kế UI/UX?

Là một lập trình viên, làm sao để ta hiểu UI/UX tốt hơn? Có cần phải có chút năng khiếu, chút hoa tay không? Có cần phải sắm một bộ não thật sáng tạo không?

Stephen McLean nói về điều ấy rất tốt. Bài của ông này trên freeCodeCamp. Nếu muốn đọc toàn bộ, hãy truy cập link này. Hoặc bạn có thể đọc những ý chính dưới đây.

Chăm chỉ học

Nếu bạn sinh ra đã là phù thuỷ của UX, điều ấy rất tốt. Nhưng con đường này không trải hoa hồng. Chỉ có luyện tập mới làm bạn tốt lên. Xuất phát điểm của bạn tốt hay kém, bạn đều có thể học. Bạn đã học được cách code, vậy bạn cũng sẽ học được UI/UX.

Nhìn. Nghĩ. Và ăn trộm.

Cũng như code vậy, bạn phải xem người khác làm gì, nghĩ xem tại sao họ làm thế. Và nếu họ làm tốt? Tất nhiên rồi, sao không tiện tay “cuỗm” luôn những kinh nghiệm ấy? Picasso đã bảo “Good artists copy, Great artists steal”.

Theo chân các lý thuyết

Ta đã biết về S.O.L.I.D. Ta đã được nghe là phải làm theo các design pattern. Với UI/UX cũng có những thứ như vậy. Học chúng, và ta sẽ không cần mò mẫm theo kinh nghiệm.

UI UX tuyển dụng nhiều vị trí, lương cao trên TopDev

Thực hành

Điều này thật dễ hiểu. Học đi đôi với hành mà. Làm sao ta có thể tốt một thứ gì nếu chưa từng động tay vào?

Đừng bỏ cuộc

Thiết kế với ta rõ ràng chẳng dễ dàng. Nhưng nếu ta sớm dừng cuộc chơi thì đám designer sẽ tiếp tục cười vào mặt ta. Người dùng cũng sẽ tiếp tục phàn nàn. Vậy nên, hãy tiếp tục dù chân bạn có mỏi rã rời.

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

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

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

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

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

Shifting left là một nguyên tắc phát triển, nêu rõ rằng bảo mật sẽ di chuyển từ bên phải (hoặc kết thúc) của vòng đời lập trình phần mềm (SDLC) sang bên trái (bắt đầu). Nói cách khác, bảo mật nên được thiết kế và tích hợp vào tất cả các giai đoạn trong quá trình phát triển. Sự thay đổi mới này đòi hỏi các nhà phát triển phải có quyền sở hữu an ninh và hiểu về các nguyên tắc bảo mật. Tin tốt là có rất nhiều công cụ có sẵn để giúp các nhà phát triển trong quá trình này.

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

Trong bài viết này, chúng ta sẽ chia Bảo mật Ứng dụng thành các lĩnh vực chính và tìm hiểu một số giải pháp mã nguồn mở miễn phí giúp các nhà phát triển và tổ chức đảm bảo mọi giai đoạn của SLDC, các thay đổi này giúp họ cải thiện chất lượng và bảo mật tổng thể phần mềm của họ.

Shifting left giống như thêm công việc bổ sung vào phần mềm của nhà phát triển, nhưng trên thực tế, nó cho phép các nhà phát triển tìm hiểu thêm về thực tiễn bảo mật, giúp giảm thời gian sữa lỗi và mất thêm một chút thời gian hơn để xây dựng các ứng dụng tuyệt vời.

Bảo mật ứng dụng trong quá trình lập trình phần mềm

Điều quan trọng nhất là bạn phải nhận ra rằng tất cả các lỗ hổng bảo mật ứng dụng không thể được sửa chữa bởi một phần mềm duy nhất. Bảo mật thành công đòi hỏi phải tiếp cận nhiều lớp với nhiều tuyến phòng thủ cho các giai đoạn khác nhau của SDLC.

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

Các công cụ chúng ta sẽ tìm hiểu bao gồm:

  • SAST – Static Application Security Testing (Kiểm tra bảo mật ứng dụng tĩnh)
  • DAST – Dynamic Application Security Testing (Kiểm tra bảo mật ứng dụng động)
  • IAST – Integrated Application Security Testing (Kiểm thử bảo mật ứng dụng tích hợp)
  • RASP – Run-time Application Self Protection (Tự bảo vệ ứng dụng trong thời gian chạy)
  • Dependency Scanning
  • Secrets Detection

Mặc dù sự thật là các lỗ hổng được chọn để kiểm tra sớm sẽ rẻ và dễ dàng khắc phục hơn, bạn không thể tìm kiếm tất cả các lỗ hổng trong giai đoạn đầu của quá trình phát triển. Bảo mật cần phải trải đều và được quan tâm trong toàn bộ quá trình SDLC.

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

  Bảo mật web - Một số kiểu tấn công
  Tìm hiểu về thuật ngữ bảo mật

SAST

Static Application System Testing – còn được gọi là “white box testing”, xuất hiện sớm nhất và là loại phổ biến nhất về bảo mật ứng dụng tự động. SAST quét mã nguồn của ứng dụng để tìm mọi lỗ hổng đã biết. Vì SAST không yêu cầu ứng dụng biên dịch hoặc chạy khi tìm lỗ hổng (không giống như DAST), nên nó được triển khai rất sớm trong SDLC.

Xem thêm:  Hướng dẫn nhận Code giảm giá Lazada 50K

Nó cũng thực hiện các hướng dẫn và tiêu chuẩn mã hoá mà không cần thực thi mã cơ bản. Danh mục thử nghiệm ứng dụng này có sẵn rất nhiều giải pháp, vì vậy khi quyết định sử dụng một giải pháp, hãy đảm bảo giải pháp đó được hỗ trợ và thường xuyên được cập nhật. Dưới đây là một số công cụ SAST miễn phí tốt nhất.

NodeJsScan

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

NodeJsScan có giao diện dòng lệnh để tích hợp dễ dàng với các DevSecOps CI/CD pipelines và tạo ra các kết quả trong JSON.

Một tệp cấu hình có sẵn cho mỗi ngôn ngữ có thể được sửa đổi cho việc tìm kiếm. Tổng quan về các tệp, cũng như toàn bộ cơ sở code, có thể được hiển thị thông qua các số liệu thống kê và biểu đồ tròn. Chương trình có thể phát hiện lỗi tràn bộ nhớ đệm và lỗi trong code Java có thể chứa rủi ro bảo mật OWASP.

SonarQube

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

Được coi là một trong những công cụ đánh giá code tự động tốt nhất hiện có trên thị trường. SonarQube có hàng ngàn quy tắc phân tích code tĩnh (Static Code Analysis) tự động. SonarQube cũng hỗ trợ 27 ngôn ngữ hiện đại và lỗi thời (nói lỗi thời vậy chứ vẫn còn có nhiều giá trị lắm à nha) để SonarQube có thể bao quát toàn bộ dự án của bạn và sự phát triển của nó.

Dynamic Application Security Testing – còn được gọi là “black box testing”. kỹ thuật này không tìm lỗ hổng trong mã nguồn như SAST, mà là tìm lỗ hổng trong lúc ứng dụng đang chạy. Nó thực hiện điều này bằng cách sử dụng các kỹ thuật injection trên ứng dụng. DAST có thể xác định các lỗ hổng bảo mật phổ biến, chẳng hạn như SQL injection và XSS. DAST cũng chú ý tới các vấn đề như thời gian chạy không thể xác định được bằng phân tích tĩnh, các vấn đề về xác thực và cấu hình máy chủ, cũng như các lỗ hổng chỉ hiển thị khi người dùng đã đăng nhập.

OWASP ZAP

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

OWASP ZAP là công cụ DAST mã nguồn mở, miễn phí được trang bị đầy đủ tính năng, bao gồm cả tự động quét lỗ hổng và các công cụ để hỗ trợ việc pentest web-app thủ công. ZAP có một danh sách lớn các lỗ hỗng mà nó có thể khai thác hoặc xác định.

Interactive Application Security Testing – hay còn được gọi là “grey box testing”, là công nghệ kết hợp đồng thời các yêu tố của cả SAST và DAST. Nó thường được triển khai như một đặc vụ trong thời gian chạy thử nghiệm (ví dụ: thiết bị cho máy ảo Java[JVM] hoặc .NET CLR) để quan sát hoạt động hoặc các cuộc tấn công và xác định các lỗ hổng.

Contrast Security – Community

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

Contrast là sản phẩm đầu tiên dành cho các nhà phát triển có khả năng tìm hiểu sâu hơn vào các lỗ hổng khi không biết về bối cảnh thời gian chạy của ứng dụng như bộ điều khiển, logic ứng dụng, lớp dữ liệu, chế độ xem, thư viện người dùng, các thành phần của mã nguồn và máy chủ của ứng dụng.

Xem thêm:  Lỗ hổng bảo mật trên Plugin Live Chat with Facebook Messenger

Runtime Application Self Protection – được cấu hình trên một máy chủ và sẽ khởi động khi ứng dụng chạy. Nó được thiết kế để phát hiện các cuộc tấn công vào một ứng dụng trong thời gian thực. Khi ứng dụng bắt đầu chạy, RASP có thể bảo vệ ứng dụng khỏi đầu vào hoặc các hành vi độc hại bằng cách phân tích cả hành vi của ứng dụng và bối cảnh của hành vi đó. Bằng cách sử dụng ứng dụng để liên tục theo dõi hành vi của chính nó, các cuộc tấn công có thể được xác định và giảm thiểu ngay lập tức mà không cần đến sự can thiệp của con người.

Sqreen

Sqreen Runtime Application Self-Protection xác định các cuộc tấn công khai thác lỗ hổng trong sản phẩm bằng cách tận dụng đầy đủ bối cảnh của các yêu cầu.

Sqreen bao gồm tất cả top 10 lỗ hổng bảo mật hàng đầu của OWASP như SQL injection, XSS và SSRF. Điều khiến Sqreen trở nên mạnh mẽ như vậy là khả năng tận dụng logic thực thi của các yêu cầu để chặn các cuộc tấn công với mức độ thất bại thấp hơn nhiều so với các giải pháp hiện có khác. Sqreen cũng có thể thích ứng với ngăn xếp riêng cụ thể của ứng dụng, do đó bạn không cần phải triển khai lại và cấu hình trong khi ứng dụng của bạn vẫn được setup đơn giản và nhanh chóng.

Denpendency Scanning giúp bạn tự động tìm các lỗ hổng bảo mật trong khi bạn đang phát triển và kiểm tra ứng dụng của mình, ví dụ như khi ứng dụng của bạn đang sử dụng thư viện (open source) dễ bị tổn thương.

Snyk

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

Synk là tổ chức đầu tiên của nhà phát triển với các giải pháp mã nguồn mở được duy trì tốt nhất cho các nhà phát triển. Synk cung cấp các giải pháp doanh nghiệp hiệu quả có sẵn cho các tổ chức lớn hơn.

Snyk có một loạt các tính năng tuyệt vời giúp biến bảo mật thành một phần của quá trình phát triển như khả năng phát hiện các lỗ hổng từ bên trong IDE của bạn và quét các navtive git để kiểm tra các dự án trong kho lưu trữ của bạn. Snyk cũng cung cấp một cổng bảo mật để ngăn các lỗ hổng mới đi qua quy trình xây dụng và môi trường sản phẩm để kiểm tra môi trường chạy của bạn nhằm đảm bảo không mắc phải các lỗ hổng hiện có.

WhiteSource Bolt for GitHub

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

WhiteSource giống như Snyk, cũng có một số công cụ miễn phí tuyệt vời cho các nhà phát triển cũng như các giải pháp doanh nghiệp cho các tổ chức lớn. WhiteSource Bolt for Github là một ứng dụng miễn phí, nó liên tục quét các repos của bạn, phát hiện các lỗ hổng của các thành phần trong mã nguồn và cung cấp các bản sửa lỗi. Nó hỗ trợ của kho riêng và kho công cộng.

Hơn 200 ngôn ngữ lập trình được hỗ trợ  và theo dõi liên tục từ nhiều cơ sở dữ liệu lỗ hổng mã nguồn mở như NVD.

Các bí mật như key API, thông tin cơ sở dữ liệu và chứng chỉ bảo mật là những viên ngọc quý của các tổ chức vì nó có thể cung cấp quyền truy cập vào các hệ thống nhạy cảm.Secrets detection có thể quét mã nguồn, logs và các tệp khác để tiếp tục tìm các bí mật khác. Đây là một dich vụ đặc biệt vì hầu hết các bí mật thường luôn là các chuỗi entropy cao (các chuỗi được thiết kế để xuất hiện ngẫu nhiên), nhưng hầu hết các chuỗi entropy cao không phải là bí mật, nên chúng rất khó bị phát hiện. Nó đòi hỏi các thuật toán phân loại tiên tiến để phát hiện các bí mật với mức độ chính xác và recall cao.

Xem thêm:  Hướng dẫn DDOS memcached và cách phòng chống

Secrets detection thường bị nhầm lẫn với SAST vì cả hai đều quét mã nguồn. Nhưng không giống như SAST, chỉ liên quan đến phiên bản hiện tại của ứng dụng, Secrets detection liên quan đến toàn bộ các phiên bản của dự án. Các hệ thống kiểm soát phiên bản như git, sẽ theo dõi và lưu trữ tất cả các thay đổi đối với một dự án. Nếu các phiên bản trước của mã nguồn chứa các bí mật được mã hoá cứng bên trong, đã bị xoá trong giai đoạn cuối, nên việc đánh giá code và các công cụ như SAST sẽ bỏ lỡ các bí mật này, do đó nó có thể nằm trong kho git và bị xâm phạm. Đây là lý do tại sao Secrets detection lại khác SAST.

GitGuardian

Công nghệ của GitGuardian hoạt động bằng cách quét các kho lưu trữ của nhà phát triển để tìm bằng chứng về dữ liệu nhạy cảm.

GitGuardian bao gồm hơn 300 loại dữ liệu nhạy cảm khác nhau từ key kết nối database, chứng chỉ SSL, đến username và password. Những dữ liệu này được phát hiện thông qua sự kết hợp của các thuật toán, bao gồm các kỹ thuật pattern matching (so trùng mẫu) tinh vi. GitGuardian có thể được tích hợp với tài khoản Github của bạn và được cấu hình trong vòng vài phút nên các nhà phát triển có thể sử dụng API GitGuardian để phát hiện dữ liệu trong bất kỳ dịch vụ nào, kể cả trong thư mục, ứng dụng email hoặc kênh Slack.

Tổng kết

Với rất nhiều giải pháp có sẵn, bạn có thể cảm thấy khó khăn khi quyết định chọn công cụ nào trong bài viết. Nhưng phải nhớ, hãy luôn xem xét công dụng của mỗi công cụ có phù hợp với quy trình công việc hiện tại của bạn không vì ngay cả các công cụ tuyệt vời cũng có thể trở nên vô dụng nếu chúng quá khó sử dụng.

Mỗi ứng dụng đều khác nhau và các công cụ được nêu ở trên nên được coi là mức bảo vệ tối thiểu, nếu bạn và tổ chức của bạn có thể không cần các giải pháp chi tiết hơn. Bảo mật là một trong những kỹ năng được đánh giá cao nhất của các nhà phát triển, mặc dù việc bảo mật có vẻ được xem như là một nhiệm vụ khó khăn, nhưng đó là một khoản đầu tư đáng giá để hiểu và thực hiện các hệ thống này trong toàn bộ vòng đời phát triển của ứng dụng.

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

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

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

Năng lực lãnh đạo đổi mới trong bối cảnh hiện đại

năng lực lãnh đạo

Thế giới nhân sự đang thay đổi từng ngày. Và kỹ năng thích ứng nhanh nhẹn đã trở thành một kỹ năng cần thiết mà mọi chuyên gia nhân sự cần phải có. Tuy nhiên, để có thể bắt kịp xu thế chung của thời đại, nhà quản lý cần nhiều hơn thế. Bên cạnh tối ưu hóa những công cụ công nghệ hỗ trợ, trình độ chuyên môn cao thì năng lực lãnh đạo nhân sự đổi mới là bí quyết giúp họ nuôi dưỡng và phát triển nguồn lực nhân sự của tổ chức/doanh nghiệp.

Nghiên cứu thực tế và những con số

Không có một định nghĩa nào rõ ràng về năng lực lãnh đạo đổi mới. Có thể hiểu rằng, nó là nhóm năng lực được xây dựng và tập hợp dựa trên nhiều kỹ năng khác nhau. Chúng bỗ trợ nhau để tạo ra một tố chất dành riêng cho những nhà lãnh đạo nhân sự. Đặc biệt hơn, các tố chất đó nhằm hướng đến mục tiêu đào tạo và phát triển con người.

  Phân tích con người - Chiến lược quan trọng trong ngành Nhân sự năm 2023
  Đào tạo (Training) - Đâu là thời điểm bạn cần trải nghiệm?

năng lực lãnh đạo

Trong một báo cáo từ State of HR được thông tin vào tháng 12 năm 2019, một khảo sát từ các chuyên gia nhân sự toàn cầu về những liên quan đến khái niệm năng lực lãnh đạo đổi mới. Thông qua tổng hợp và phân tích, kết quả được trình bày trong biểu đồ dưới đây:

Dưới đây là 3 đặc điểm được mô tả về các tố chất làm nên một người HR giỏi gồm:

1. Tư duy đổi mới

2. Kiến thức công nghệ

3. Kỹ năng tổ chức đa thế hệ

Nếu xem xét kỹ lưỡng, có rất nhiều kỹ năng liên quan đến HR. Nhưng xét trên khía cạnh chung, một số kỹ năng dường như chưa đủ thuyết phục. Vì thế, đối với mục đích của bài viết này, chúng ta sẽ khai thác chi tiết về ba đặc điểm giúp hình thành năng lực lãnh đạo đổi mới từ suy nghĩ chung của các chuyên gia nhân sự hàng đầu. 

Tư duy đổi mới

Việc nắm bắt được xu thế của trí tuệ nhân tạo – EI và cách ứng dụng nó vào việc vận hành; quản lý các quy trình tuyển dụng nhân sự phức tạp là điều rất quan trọng trong thời đại phát triển như hiện tại. Khi AI phát huy sức mạnh, người thuộc lĩnh vực này sẽ có nhiều cơ hội hơn để tự phát triển mình.

Xem thêm: Trí tuệ cảm xúc là gì và áp dụng như thế nào trong ngành Nhân sự

năng lực lãnh đạo

Làm thế nào để tư duy đổi mới?

Dưới đây là 3 cách thức giúp các nhà lãnh đạo thể nuôi dưỡng và phát triển năng lực này cho nhân viên của họ.

Truyền cảm hứng và tạo động lực cho nhân viên của mình: Đặt ra các chương trình giúp họ rèn luyện chuyên môn và năng lực tư duy đổi mới. Điểm mấu chốt nằm ở việc tạo cơ hội nói lên những chia sẻ. Đó là cách tốt nhất để tôn trọng nhân viên. Đồng thời, tạo điều kiện cho những sáng kiến mới ra đời. 

Tập trung vào sự cố gắng của nhân viên và đánh giá cao những nỗ lực của họ:  Thách thức của sự đổi mới thường đến sau sự thất bại. Đừng chỉ mãi tập trung vào kết quả. Vì như thế, bạn sẽ không bao giờ có thể tiến xa. Bạn có thể tuyên dương những nhân viên đạt thành tích tốt. Nhưng, đừng quên đi sự công nhận cho những cá nhân xứng đáng.

Tạo chuỗi liên kết các giải pháp nhân sự, đào tạo: Tạo ra một trình tự luân phiên các ý tưởng. Tiếp đó là tiếp thu các phản hồi. Họ sẽ ngồi lại để thảo luận các vấn đề xoay quanh chuỗi ý tưởng. Từ đó đưa ra các đánh giá, giải pháp thích hợp. Đây được xem là cách thức phù hợp để kích thích tăng cường khả năng sáng tạo, tư duy đổi mới và tinh thần đồng đội.

Những kiến thức về công nghệ

Nhân viên ngày nay họ rất am hiểu khi nói đến những vấn đề công nghệ. Chúng ta có thể nhận thấy rõ sự khác biệt giữa người lớn – thế hệ Millennials (1980 – 1994) và thế hệ Z (1995 – 2012) qua những đặc điểm dưới đây: 

năng lực lãnh đạo

Cả hai thế hệ đều là những nhóm người am hiểu về công nghệ. Điều này không có nghĩa là các thế hệ khác thiếu đi sự hiểu biết về công nghệ. Đây chỉ là một khái niệm khái quát. Và thông qua bạn thống kê mô tả. Ý quan trọng cần nhấn mạnh chính là các nhân viên của Thế hệ Z đã sẵn sàng.

Điều đặc biệt gì ở Thế hệ Z?

Thế hệ Z là nhóm thế hệ ra đời trong thời kỳ ổn định của sự phát triển công nghệ kỹ thuật trước khi nó bùng nổ và có những bước tiến đột phá như hiện nay. 

Xem thêm: Những điều doanh nghiệp cần “lưu tâm” khi làm việc với Gen Z

năng lực lãnh đạo

Đây cũng là thế hệ được kỳ vọng kế thừa và phát triển về mọi mặt. Đặc biệt là việc kết hợp tư duy đổi mới và những am hiểu về công nghệ. Vì vậy, công nghệ có mối liên hệ mật thiết với năng lực tư duy đổi mới. Các nhà lãnh đạo nhân sự nên tạo cơ hội cho các nhân viên. Vì họ là những người trẻ cần sự trau dồi và hoàn thiện từng ngày. Thực tế cho thấy, họ sẽ là người vận dụng những gì học được vào lĩnh vực nhân sự. Đây được xem là cơ hội tốt để họ được đào tạo chuyên sâu. Đồng thời, hướng đến một nguồn lực đa nhiệm và đổi mới tư duy. 

Kỹ năng tổ chức đa thế hệ

Một môi trường làm việc trung bình có thể bao gồm 4 thế hệ khác nhau. Tùy từng đặc tính ngành nghề và những yếu tố tác động như: văn hóa, tôn giáo, ngôn ngữ,.. mà số lượng các thế hệ có thể nhiều hoặc ít hơn.

nh đạo nhân sự cần phải nhận ra rằng mỗi thế hệ đều sở hữu một bộ kỹ năng riêng. Văn hóa làm việc nhân sự có một ý nghĩa lớn đối với các thế hệ. Mức độ tương tác giao tiếp, khả năng vận dụng kỹ năng, kinh nghiệm đều bị yếu tố văn hóa chi phối. Thậm chí, có thể ảnh hưởng đến hiệu suất làm việc của từng cá nhân. Do vậy, kỹ năng tổ chức và phát triển mô hình đào tạo nguồn nhân lực đa thế hệ là rất quan trọng.

Hiểu được tầm quan trọng này, các hệ giá trị cần thiết đã được đặt ra đáp ứng nhu cầu đa văn hóa của các nhân viên: tính đa dạng trong giao tiếp nhân sự, sáng tạo đổi mới tư duy và tương tác hành vi. 

Lời kết

Thực tế, còn rất nhiều kỹ năng có liên quan đến năng lực đổi mới chưa được phân tích. Đơn giản vì sự chi phối của chúng còn quá giới hạn. Và điều đó không có nghĩa là chúng ít quan trọng hơn. Dù đó là kỹ năng nào thì việc hoạch định các chiến lược cụ thể rất quan trọng. Đồng thời, đây cũng là cơ hội để đào tạo và phát triển nguồn nhân lực trẻ; giúp họ thích ứng với môi trường nhân sự đang có những bước tiến lớn, đáng mong đợi.

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

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

Danh sách liên kết đơn trong C++

Danh sách liên kết đơn trong C++
Bài viết được sự cho phép của tác giả Khiêm Lê

Danh sách liên kết đơn là gì?

Danh sách liên kết đơn (Single Linked List) là một cấu trúc dữ liệu động, nó là một danh sách mà mỗi phần tử đều liên kết với phần tử đúng sau nó trong danh sách. Mỗi phần tử (được gọi là một node hay nút) trong danh sách liên kết đơn là một cấu trúc có hai thành phần:

  • Thành phần dữ liệu: lưu thông tin về bản thân phần tử đó.
  • Thành phần liên kết: lưu địa chỉ phần tử đứng sau trong danh sách, nếu phần tử đó là phần tử cuối cùng thì thành phần này bằng NULL.

Tham khảo thêm: việc làm lập trình c++ lương cao tại Topdev

Danh sách liên kết đơn trong C++
Minh họa danh sách liên kết đơn

Đặc điểm của danh sách liên kết đơn

Do danh sách liên kết đơn là một cấu trúc dữ liệu động, được tạo nên nhờ việc cấp phát động nên nó có một số đặc điểm sau đây:

  • Được cấp phát bộ nhớ khi chạy chương trình
  • Có thể thay đổi kích thước qua việc thêm, xóa phần tử
  • Kích thước tối đa phụ thuộc vào bộ nhớ khả dụng của RAM
  • Các phần tử được lưu trữ ngẫu nhiên (không liên tiếp) trong RAM

Và do tính liên kết của phần tử đầu và phần tử đứng sau nó trong danh sách liên kết đơn, nó có các đặc điểm sau:

  • Chỉ cần nắm được phần tử đầu và cuối là có thể quản lý được danh sách
  • Truy cập tới phần tử ngẫu nhiên phải duyệt từ đầu đến vị trí đó
  • Chỉ có thể tìm kiếm tuyến tính một phần tử
  1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++
  Code game rắn săn mồi trên console bằng C++

Cài đặt danh sách liên kết đơn

Trước khi đi vào cài đặt danh sách liên kết đơn, hãy chắc chắn rằng bạn đã nắm vững phần con trỏ và cấp phát động trong C++. Do danh sách liên kết đơn là một cấu trúc dữ liệu động, nếu bạn không nắm vững con trỏ và cấp phát động sẽ rất khó để bạn hiểu được bài viết này. Nếu bạn cảm thấy chưa tự tin, hãy dành ít thời gian để xem bài viết này của mình. Còn bây giờ thì bắt đầu thôi!

Tạo node

Danh sách liên kết đơn được tạo thành từ nhiều node, do đó, chúng ta sẽ cùng đi từ node trước. Một node gồm hai thành phần là thành phần dữ liệu và thành phần liên kết. Thành phần dữ liệu có thể là kiểu dữ liệu có sẵn hoặc bạn tự định nghĩa (struct hay class…), trong bài viết này để đơn giản mình sẽ sử dụng kiểu int cho phần dữ liệu. Thành phần liên kết là địa chỉ đương nhiên sẽ là con trỏ, con trỏ này trỏ đến node tiếp theo, do đó, con trỏ này là con trỏ trỏ vào một node.

struct Node
{
	int data;
	Node* next;
};

Để tạo một node mới, ta thực hiện cấp phát động cho node mới, khởi tạo giá trị ban đầu và trả về địa chỉ của node mới được cấp phát.

Node* CreateNode(int init_data)
{
	Node* node = new Node;
	node->data = init_data;
	node->next = NULL;      // node vừa tạo chưa thêm vào danh sách nên chưa liên kết với phần tử nào cả nên phần liên kết gán bằng NULL
	return node;
}

Tạo danh sách liên kết đơn

Ta đã có được thành phần tạo nên danh sách liên kết đơn là node, tiếp theo chúng ta cần quản lý chúng bằng cách biết được phần tử đầu và cuối. Vì mỗi phần tử đều liên kết với phần tử kế vậy nên tả chỉ cần biết phần tử đầu và cuối là có thể quản lý được danh sách này. Vậy đơn giản ta cần tạo một cấu trúc lưu trữ địa chỉ phần tử đầu (head) và phần tử cuối (hay phần tử đuôi tail).

struct LinkedList
{
	Node* head;
	Node* tail;
};

Khi mới tạo danh sách, danh sách sẽ không có phần tử nào, do đó head và tail không trỏ vào đâu cả, ta sẽ gán chúng bằng NULL. Ta xây dựng hàm tạo danh sách như sau:

void CreateList(LinkedList& l)
{
	l.head = NULL;
	l.tail = NULL;
}

Bây giờ để tạo một danh sách, ta làm như sau:

LinkedList list;
CreateList(list); // Gán head và tail bằng NULL

Thêm phần tử vào danh sách

Thêm vào đầu

Để thêm node vào đầu danh sách, đầu tiên ta cần kiếm tra xem danh sách đó có rỗng hay không, nếu danh sách rỗng, ta chỉ cần gán head và tail của danh sách bằng node đó. Ngược lại nếu danh sách không rỗng, ta thực hiện trỏ thành phần liên kết vào head, sau đó gán lại head bằng node mới.

void AddHead(LinkedList& l, Node* node)
{
	if (l.head == NULL)
	{
		l.head = node;
		l.tail = node;
	}
	else
	{
		node->next = l.head;
		l.head = node;
	}
}

Danh sách liên kết đơn trong C++
Thêm phần tử vào đầu danh sách liên kết đơn

Như trong hình trên, chúng ta thêm node có data bằng 0 vào danh sách. Ta thực hiện trỏ next của node đó vào head của danh sách (chính là node đầu tiên của danh sách có data bằng 1), sau đó ta trỏ head vào node có data 0 vừa được thêm. Vậy là phần tử đó đã nằm ở đầu danh sách rồi.

Thêm vào cuối

Tương tự, để thêm node vào cuối danh sách, đầu tiên ta kiểm tra xem danh sách rỗng hay không, rỗng thì gán head và tail đều bằng node mới. Nếu không rỗng, ta thực hiện trỏ tail->next vào node mới, sau đó gán lại tail bằng node mới (vì bây giờ node mới thêm chính là tail).

void AddTail(LinkedList& l, Node* node)
{
	if (l.head == NULL)
	{
		l.head = node;
		l.tail = node;
	}
	else
	{
		l.tail->next = node;
		l.tail = node;
	}
}

Danh sách liên kết đơn trong C++
Thêm phần tử vào cuối danh sách liên kết đơn

Trong hình trên, chúng ta thực hiện thêm node có data bằng 6 vào danh sách. Tail hiện tại là node có data 5, thực hiện gán tail->next bằng node mới để nối thêm nó vào đuôi danh sách, lúc này node mới trở thành phần tử cuối danh sách nên ta gán tail lại bằng node mới.

Thêm vào sau node bất kỳ

Để thêm một node p vào sau node q bất kỳ, đầu tiên ta cần kiếm tra xem node q có NULL hay không, nếu node q là NULL tức là danh sách rỗng, vậy thì ta sẽ thêm vào đầu danh sách. Nếu node q không NULL, tức là tồn tại trong danh sách, ta thực hiện trỏ p->next = q->next, sau đó q->next = p. Tiếp theo chúng ta kiểm tra xem node q trước đó có phải là node cuối hay không, nếu node q là node cuối thì thêm p vào, p sẽ thành node cuối nên ta gán lại tail = p.

void InsertAfterQ(LinkedList& l, Node* p, Node* q)
{
	if (q != NULL)
	{
		p->next = q->next;
		q->next = p;
		if (l.tail == q)
			l.tail = p;
	}
	else
		AddHead(l, p);
}

Danh sách liên kết đơn trong C++
Thêm phần tử vào sau nút Q trong danh sách liên kết đơn

Trong hình trên, ta thêm node có data bằng 4 (node p) vào sau node có data bằng 3 (node q). Ta trỏ next của node p vào next của node q tức là node có data bằng 5, sau đó trỏ next của node q vào node p vậy là node p đã được thêm vào danh sách.

Xóa phần tử khỏi danh sách

Xóa ở đầu

Để xóa phần tử ở đầu danh sách, ta kiểm tra xem danh sách đó có rỗng hay không, nếu rỗng, ta không cần xóa, trả về kết quả là 0. Nếu danh sách không rỗng, ta thực hiện lưu node head lại, sau đó gán head bằng next của node head, sau đó xóa node head đi. Tiếp theo ta cần kiểm tra xem danh sách vừa bị xóa đi node head có rỗng hay không, nếu rỗng ta gán lại tail bằng NULL luôn sau đó trả về kết quả 1.

int RemoveHead(LinkedList& l, int& x)
{
	if (l.head != NULL)
	{
		Node* node = l.head;
		x = node->data;      // Lưu giá trị của node head lại
		l.head = node->next;
		delete node;         // Hủy node head đi
		if (l.head == NULL)
			l.tail = NULL;
		return 1;
	}
	return 0;
}

Lưu ý trước khi xóa node head đi, ta dùng biến tham chiếu x để lưu trữ lại giá trị của node bị hủy để sử dụng.

Danh sách liên kết đơn trong C++
Xóa phần tử đầu danh sách liên kết đơn

Trong hình trên, mình thực hiện xóa node đầu tiên có data bằng 0. Mình trỏ head đến next của node 0 (hiện đang là head), thì head lúc này sẽ là node 1, sau đó mình hủy đi node 0 là được.

Xóa ở sau node bất kỳ

Để xóa một node p sau node q bất kỳ, ta kiểm tra xem node q có NULL hay không, nếu node q NULL thì không tồn tại trong danh sách, do đó trả về 0, không xóa. Nếu node q khác NULL nhưng next của q là NULL, tức là p bằng NULL thì không xóa, trả về 0 (do sau q không có node nào cả, q là tail). Nếu node p tồn tại, ta thực hiện kiểm tra xem node p có phải là tail hay không, nếu node p là tail thì gán lại tail là q, tức là node trước đó để xóa node p đi.

int RemoveAfterQ(LinkedList& l, Node* q, int& x)
{
	if (q != NULL)
	{
		Node* p = q->next;
		if (p != NULL)
		{
			if (l.tail == p)
				l.tail = q;
			q->next = p->next;
			x = p->data;
			delete p;
			return 1;
		}
		return 0;
	}
	return 0;
}

Trong hình trên, ta thực hiện xóa node có data 3 (node p) sau node có data 2 (node q). Ta trỏ next của node q vào next của node p tức là node có data 4, sau đó xóa node p đi là xong.

Duyệt danh sách và in

Sau khi có các thao tác thêm, xóa, chúng ta có thể in ra danh sách để kiểm tra xem có hoạt động đúng hay không. Để in danh sách, ta duyệt từ đầu đến cuối danh sách và in ra trong lúc duyệt. Ta gán một node bằng head, sau đó kiểm tra xem node đó có NULL hay không, không thì in ra data của node đó, sau đó gán tiếp node đó bằng next của chính nó tức node đó bây giờ là node tiếp theo, cứ như vậy cho đến hết.

void PrintList(LinkedList l)
{
	if (l.head != NULL)
	{
		Node* node = l.head;
		while (node != NULL)
		{
			cout << node->data << ' ';
			node = node->next; // Chuyển sang node tiếp theo
		}
	}
}

Lấy giá trị node bất kỳ

Để lấy giá trị phần tử trong danh sách, ta thực hiện duyệt tương tự như khi in phần tử. Ta sẽ tạo một biến đếm để biết vị trí hiện tại, duyệt qua các node cho đến khi node bằng NULL hoặc biến đếm bằng với vị trí node cần lấy. Kiểm tra xem nếu node khác NULL và biến đếm bằng vị trí cần lấy, ta sẽ trả về địa chỉ của node đó, ngược lại trả về NULL (danh sách rỗng hoặc là vị trí cần lấy nằm ngoài phạm vi của danh sách).

Node* GetNode(LinkedList& l, int index)
{
	Node* node = l.head;
	int i = 0;
	while (node != NULL && i != index)
	{
		node = node->next;
		i++;
	}
	if (i == index && node != NULL)
		return node;
	return NULL;
}

Tìm kiếm phần tử trong danh sách

Ý tưởng tìm kiếm phần tử cũng là duyệt danh sách, nếu như chưa tìm thấy thì tiếp tục duyệt. Sau khi kết thúc duyệt, ta chỉ cần kiểm tra xem node duyệt có bằng NULL hay không, nếu không tức là đã tìm thấy, ta sẽ trả về địa chỉ của node đó.

Node* Search(LinkedList l, int x)
{
	Node* node = l.head;
	while (node != NULL && node->data != x)
		node = node->next;
	if (node != NULL)
		return node;
	return NULL;
}

Đếm số phần tử của danh sách

Đếm số phần tử thì cũng tương tự, ta áp dụng duyệt từ đầu đếm cuối và đếm số node.

int Length(LinkedList l)
{
	int count = 0;
	Node* node = l.head;
	while (node != NULL)
	{
		count++;
		node = node->next;
	}
	return count;
}

Xóa danh sách

Để xóa danh sách, ta cần hủy tất cả các node tức là duyệt và hủy từng node. Ở đây mình sẽ dùng lại hàm RemoveHead. Đầu tiên, ta gán một node bằng head, kiểm tra nếu node đó khác NULL thì gọi RemoveHead và gán lại node bằng head tiếp, cứ lặp như vậy cho đến khi node đó NULL thì thôi. Sau khi xóa hết tất cả phần tử thì gán lại tail bằng NULL.

void DestroyList(LinkedList& l)
{
	int x;
	Node* node = l.head;
	while (node != NULL)
	{
		RemoveHead(l, x);
		node = l.head;
	}
	l.tail = NULL;
}

Tổng kết

Vậy là trong bài này, mình đã giới thiệu với các bạn về danh sách liên kết đơn và một số thao tác cơ bản trên danh sách. Các bạn không nhất thiết phải làm theo cách của mình, có rất nhiều cách để thực hiện khác nhau, chỉ cần bạn nắm vững về con trỏ và cấp phát động trong C++. Nếu thấy hay, đừng quên chia sẻ cho bạn bè. Cảm ơn các bạn đã theo dõi bài viết!

Source code

LinkedList.hpp
#ifndef LinkedList_hpp
#define LinkedList_hpp

struct Node
{
	int data;
	Node* next;
};

struct LinkedList
{
	Node* head;
	Node* tail;
};

Node* CreateNode(int init_data);
void CreateList(LinkedList& l);
void AddHead(LinkedList& l, Node* node);
void AddTail(LinkedList& l, Node* node);
void InsertAfterQ(LinkedList& l, Node* p, Node* q);
int RemoveHead(LinkedList& l, int& x);
int RemoveTail(LinkedList& l, int& x);
int RemoveAfterQ(LinkedList& l, Node* q, int& x);
Node* GetNode(LinkedList l, int index);
void PrintList(LinkedList l);
Node* Search(LinkedList l, int x);
int Length(LinkedList l);
void DestroyList(LinkedList& l);

#endif
LinkedList.cpp
#include <iostream>
#include "LinkedList.hpp"
using namespace std;

Node* CreateNode(int init_data)
{
	Node* node = new Node;
	node->data = init_data;
	node->next = NULL;
	return node;
}

void CreateList(LinkedList& l)
{
	l.head = NULL;
	l.tail = NULL;
}

void AddHead(LinkedList& l, Node* node)
{
	if (l.head == NULL)
	{
		l.head = node;
		l.tail = node;
	}
	else
	{
		node->next = l.head;
		l.head = node;
	}
}

void AddTail(LinkedList& l, Node* node)
{
	if (l.head == NULL)
	{
		l.head = node;
		l.tail = node;
	}
	else
	{
		l.tail->next = node;
		l.tail = node;
	}
}

void InsertAfterQ(LinkedList& l, Node* p, Node* q)
{
	if (q != NULL)
	{
		p->next = q->next;
		q->next = p->next;
		if (l.tail == q)
			l.tail = p;
	}
	else
		AddHead(l, p);
}

int RemoveHead(LinkedList& l, int& x)
{
	if (l.head != NULL)
	{
		Node* node = l.head;
		x = node->data;
		l.head = node->next;
		delete node;
		if (l.head == NULL)
			l.tail = NULL;
		return 1;
	}
	return 0;
}

int RemoveAfterQ(LinkedList& l, Node* q, int& x)
{
	if (q != NULL)
	{
		Node* p = q->next;
		if (p != NULL)
		{
			if (l.tail == p)
				l.tail = q;
			q->next = p->next;
			x = p->data;
			delete p;
			return 1;
		}
		return 0;
	}
	return 0;
}

Node* GetNode(LinkedList l, int index)
{
	Node* node = l.head;
	int i = 0;
	while (node != NULL && i != index)
	{
		node = node->next;
		i++;
	}
	if (i == index && node != NULL)
		return node;
	return NULL;
}

void PrintList(LinkedList l)
{
	if (l.head != NULL)
	{
		Node* node = l.head;
		while (node != NULL)
		{
			cout << node->data << ' ';
			node = node->next;
		}
	}
}

Node* Search(LinkedList l, int x)
{
	Node* node = l.head;
	while (node != NULL && node->data != x)
		node = node->next;
	if (node != NULL)
		return node;
	return NULL;
}

int Length(LinkedList l)
{
	int count = 0;
	Node* node = l.head;
	while (node != NULL)
	{
		count++;
		node = node->next;
	}
	return count;
}

void DestroyList(LinkedList& l)
{
	int x;
	Node* node = l.head;
	while (node != NULL)
	{
		RemoveHead(l, x);
		node = l.head;
	}
	l.tail = NULL;
}
main.cpp
#include <iostream>
#include "LinkedList.hpp"
using namespace std;

int main()
{
	// Create a linked list
	LinkedList list;
	CreateList(list);

	// Add sample data to list
	Node* node;
	for (auto i = 1; i <= 10; i++)
	{
		// Create new node with init data is i
		node = CreateNode(i);
		
		// Add node to head
		// List that is added node by AddHead will be reversed
		//AddHead(list, node);
		
		// Add node to Tail
		AddTail(list, node);
	}

	// Print list
	PrintList(list);
	cout << endl;

	// Get list's length
	int len = Length(list);
	cout << "Length of list: " << len << endl;

	// Get node at index 7
	Node* nodeAtIdx7 = GetNode(list, 7);
	if (nodeAtIdx7 != NULL)
		cout << "Data at node have idx 7: " << nodeAtIdx7->data << endl;

	// Search for 4 in list
	Node* search4InList = Search(list, 4);
	if (search4InList != NULL)
		cout << "4 was founded" << endl;
	else
		cout << "4 not Found" << endl;

	// Remove node after 4 in list
	int x;
	int res = RemoveAfterQ(list, search4InList, x);
	if (res)
	{
		cout << "Data of node has been removed: " << x << endl;
		cout << "List after removed: ";
		PrintList(list);
		cout << endl;
	}
	else
		cout << "Nothing is removed" << endl;

	// Insert 2409 after node 4
	Node* node2409 = CreateNode(2409);
	InsertAfterQ(list, node2409, search4InList);
	cout << "List after insert 2409 after 4: ";
	PrintList(list);
	cout << endl;
	

	// Remove Head
	res = RemoveHead(list, x);
	if (res)
	{
		cout << "Data of node has been removed: " << x << endl;
		cout << "List after removed head: ";
		PrintList(list);
		cout << endl;
	}
	else
		cout << "Nothing is removed" << endl;

	
	// Destroy all node
	DestroyList(list);
	
	return 0;
}

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

 

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

Viết ứng dụng tra số điện thoại thuộc Quốc gia nào bằng Python

Viết ứng dụng tra số điện thoại thuộc Quốc gia nào bằng Python

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

Hôm nay, mình sẽ hướng dẫn các bạn cách tạo ứng dụng tra số điện thoại đó xem nó thuộc Quốc gia bằng Python nhé. Cách thực hiện khá đơn giản vì chúng ta đã có sẵn các thư viện. Bài viết này khá basic vì dành cho người mới bắt đầu tim hiểu Python. Nếu bạn muốn học chuyên sau Python hãy comment bên dưới, anonyviet sẽ ra thêm các bài nâng cao hơn.

Viết ứng dụng tra số điện thoại thuộc Quốc gia nào bằng Python

Đây là một ứng dụng tra số điện thoại rất đơn giản, do đó bạn chỉ cần có kiến thức cơ bản về Python để có thể hoàn thành ứng dụng này.

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

Cách tạo ứng dụng tra số điện thoại

Yêu cầu

Bạn cần cài đặt các thư viện python ở trên để sử dụng trong ứng dụng này.

Cài đặt

pip install python-tk, phone-iso3166, pycountry

Mình sẽ sử dụng phone-iso3166 để xác định tên viết tắt của quốc gia rồi gán vô biến alpha_2 và pycountry để xác định tên đầy đủ của quốc gia đó bằng cách sử dụng alpha_2 mà chúng ta đã thu thập được từ phone-iso3166.

Code mẫu

>>> import pycountry
>>> from phone_iso3166.country import phone_country
>>> code = phone_country("255757295721")
>>> code
'TZ'
>>> pycountry.countries.get(alpha_2 = code)
Country(alpha_2='TZ', alpha_3='TZA', common_name='Tanzania', name='Tanzania, United Republic of', numeric='834', official_name='United Republic of Tanzania')
>>> 

Giờ thì chúng ta đã biết cách lấy thông tin quốc gia từ số điện thoại, nhưng ứng dụng này vẫn hoạt động dưới dạng command line. Nên bây giờ, chúng ta sẽ thiết kế GUI cho ứng dụng.

  Python call by gì?

Tạo file app.py

Mở notepad lên tạo file app.py với nội dung bên dưới

import json
import pycountry
from tkinter import Tk, Label, Button, Entry
from phone_iso3166.country import phone_country

class Location_Tracker:
def __init__(self, App):
self.window = App
self.window.title("Phone number Tracker")
self.window.geometry("500x400")
self.window.configure(bg="#3f5efb")
self.window.resizable(False, False)

#___________Application menu_____________
Label(App, text="Enter a phone number",fg="white", font=("Times", 20), bg="#3f5efb").place(x=150,y= 30)
self.phone_number = Entry(App, width=16, font=("Arial", 15), relief="flat")
self.track_button = Button(App, text="Track Country", bg="#22c1c3", relief="sunken")
self.country_label = Label(App,fg="white", font=("Times", 20), bg="#3f5efb")

#___________Place widgets on the window______
self.phone_number.place(x=170, y=120)
self.track_button.place(x=200, y=200)
self.country_label.place(x=100, y=280)

#__________Linking button with countries ________
self.track_button.bind("", self.Track_location)
#255757294146

def Track_location(self,event):
phone_number = self.phone_number.get()
country = "Country is Unknown"
if phone_number:
tracked = pycountry.countries.get(alpha_2=phone_country(phone_number))
print(tracked)
if tracked:
country = tracked.official_name
self.country_label.configure(text=country)

PhoneTracker = Tk()
MyApp = Location_Tracker(PhoneTracker)
PhoneTracker.mainloop()

Để chạy file vừa tạo trên windows, bạn mở cmd lên và gõ lệnh python app.py để khởi chạy chương trình

Tuyển python lương cao các công ty hot

Kết quả

Khi bạn nhập số điện thoại vào thì lưu ý số 0 đầu tiên thay bằng 84 nhé, ví dụ: 84304xxxxxx. Sau khi nhập xong, các bạn click Enter là có thể biết số điện thoại đó từ quốc gia nào rồi.

Viết ứng dụng tra số điện thoại thuộc Quốc gia nào bằng Python

Xong rồi, bạn vừa tạo ứng dụng tra vị trí số điện thoại theo quốc gia của riêng mình rồi đó. Nếu bạn thấy ứng dụng này thú vị thì hãy chia sẽ cho bạn bè nhé. Bạn cũng có thể xem thêm cách ẩn thông điệp trong ảnh mà Anonyviet đã giới thiệu.

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

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

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

Hàm tải một loạt danh sách các file javascript

Hàm tải một loạt danh sách các file javascript

Bài viết được sự cho phép của tác giả Phạm Công Sơn

Sáng sớm dạo quanh một vòng facebook thấy có bạn đăng code “Callback Hell”

Hàm tải một loạt danh sách các file javascript

Callback Hell laugh

Hồi sinh viên mình cũng code như thế đấy frown. Trước code cũng copy và copy. Hầu như không có tư duy kế thừa và  tạo hàm tái sử dụng. Giờ các bạn muốn code tốt, chắc chắn những hàm như vậy phải viết lại và không có cách nào khác phải tối ưu. Một là để cho code gọn hơn, hai là để sau này dùng còn gọi lại được. Các bạn có thể đọc lại bài Tại sao code của tôi thường ngắn gọn như vậy để nắm bắt được cách code của tôi.

  12 tips hay cho JavaScript

  24 code ES6 tân tiến để khắc phục các lỗi thực hành JavaScript

Quay trở lại việc tải một loạt các file js. Điều này chính là đã và đang được áp dụng trong phần mềm của tôi đang phát triển. Trong hệ thống của tôi, các module được tải, chuyển trang là Single Page. Chính vì vậy mỗi lần vào module thường phải tải các file js cần thiết của module đó (Mỗi module có yêu cầu một tập các file js cần tải). Nếu mà vẫn áp dụng như cách của bạn “Callback Hell” thì chắc không thể thực hiện được. Dưới đây là ví dụ một module của tôi.

Hàm tải một loạt danh sách các file javascript

Module quản lý chuyên mục cần phải tải 2 file js. ManageCategories.js và ManageCategoryNews.js

Lúc này khi tải module, server sẽ yêu cầu client tải 2 file js trước khi thực hiện chức năng trong module

Và đây là hàm tôi viết để thực hiện tải một danh sách các file js

Core.loadScripts = function (scripts, onFinish)
{
	var length = scripts == null ? 0 : scripts.length;
	if (length == 0)
	{
		onFinish();
		return;
	}
	var fLoad = function (i) {
		$.cachedScript(scripts[i], {
			success: function (js, status) {
				i++;
				if (i >= length) onFinish();
				else fLoad(i);
			}
		});
	};
	fLoad(0);
};

Ở đây gọi đệ quy và load tới khi file cuối cùng thì gọi hàm callback onFinish. Đến đây là đã có thể đáp ứng được nhu cầu của bạn “Callback Hell”. Tuy nhiên tại phần mềm của tôi còn viết thêm để tối ưu hơn. Đó là nếu các file mà đã tải rồi thì sẽ không cần thực hiện tải nữa. Vì vậy tôi đã viết thêm đoạn code sau:

Core.cacheScripts = [];
Core.getScriptsNeedLoad = function (scripts, callback)
{
	var paths = Enumerable.From(scripts).GroupJoin(Core.cacheScripts, function (s) { return s.Src; }, function ($) { return $; },
		function (s, cs) { return { s: s, cs: cs }; })
		.Where(function ($) { return $.cs.Count() == 0; }).Select(function ($) { return $.s.Src; }).Distinct().ToArray();

	Core.loadScripts(paths, function () {
		Core.cacheScripts = Enumerable.From(Core.cacheScripts).Concat(paths).ToArray();
		callback();
	});
};

Ở đoạn code này có sử dụng linq.js mà tôi đã giới thiệu ở bài Thư viện Linq.js trong javascriptCore.cacheScripts là để lưu trữ các file đã được tải. Trong hàm Core.getScriptNeedLoad sẽ loại trừ những file đã tải rồi và chỉ thực hiện các file đã tải.

Như vậy tôi đã có hàm để tải nhiều file js và đã được sử dụng trong hệ thống phần mềm của mình. Chia sẻ để các bạn có thêm kinh nghiệm.

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

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

Xem thêm Việc làm IT hấp dẫn tại TopDev

Golang là gì và tại sao bạn nên học Go?

Golang là gì và tại sao bạn nên học Go?

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

Golang là gì?

Go hay còn gọi là Golang là ngôn ngữ lập trình mã nguồn mở, được thiết kế tại Google bởi Robert Griesemer, Rob Pike, and Ken Thompson.

Go có cú pháp giống với C và tất nhiên nó là ngôn ngữ lập trình biên dich (compiled programming language)

Cú pháp của ngôn ngữ lập trình Golang (syntax) khá tinh gọn, mặc dù thật sự có những cú pháp mà người mới nhìn vào thật sự hơi khó chịu.

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

Tại sao chúng ta nên học Golang?

Vài năm gần đây có một sự phát triển mạnh mẽ của một ngôn ngữ mang tên Golang, đi đâu cũng nghe người ta bàn tán xôn xao về Go go go nghe giống như con gì đang kêu ấy nhỉ. Mà đúng thật không có gì khiến các lập trình viên điên loạn bằng thứ gọi là ngôn ngữ lập trình mới phải không?

Mình không phải là chuyên gia (expert) của ngôn ngữ lập trình này nhưng mình sẽ cố gắng chia sẻ những gì mình biết và đã học được, nên các anh chị đã là expert thì hãy đóng góp vào và chia sẻ kiến thức của mình để bài viết trở nên hoàn thiện hơn.

Giới hạn về phần cứng

Để nâng cao được hiệu suất của các ứng dụng thì việc đầu tiên chúng ta có thể nghĩ đến là nâng cấp phần cứng sử dụng CPU có nhiều core (nhân CPU)  hơn, thêm bộ nhớ đệm (cache) nhưng những việc làm này đều có giới hạn của nó và điều phải bàn đến là giá cả.

Thay vì nâng cấp phần cứng chúng ta có cách khác là xây dựng những phần mềm hiệu quả hơn, tối ưu hơn để cải tiến được hiệu suất. Nhưng đáng buồn là hầu như các ngôn ngữ lập trình mới ngày nay không mang lại hiệu quả nhiều.

Go có cái gọi là goroutines

Các ngôn ngữ như Python hay Java là các ngôn ngữ sinh ra vào những thập niên 90 thời kỳ của môi trường đơn luồng (single threaded environment) nhưng hầu như các ngôn ngữ này đều hỗ trợ tính đa luồng (multi-threading). Nhưng vấn đề thật sự nằm ở việc thực thi đồng thời (concurrent execution),  khóa luồng (threading-locking), race conditions và deadlocks.  Những vấn đề này làm cho việc tạo ra các ứng dụng đa luồng trên các ngôn ngữ này cực kỳ khó khăn.

Nếu chúng ta muốn giao tiếp giữa các luồng với nhau bằng nhưng ngôn ngữ lập trình này là rất khó.

Go được ra mắt vào năm 2009 khi mà các vi xử lý đa nhân (multi-core processors) đã có. Đó là nguyên nhân tại sao mà Go được thiết kế và phát triển với lưu ý về việc thực thi đồng thời (concurrency), Go có goroutines thay cho threads.

Goroutine có ngăn xếp phân khúc có thể mở rộng (growable segmented stacks). Điều này có nghĩa là nó sẽ sử dụng nhiều bộ nhớ RAM hơn nếu điều đó là cần thiết.

Goroutines có thời gian khởi động nhanh hơn là threads.

Goroutines có các channel và giữa các channel này có thể giao tiếp với nhau.

Goroutines có khóa mutex (mutex locking) để đảm bảo việc đọc và ghi vào một cấu trúc dữ liệu hay một biến chung không xảy ra xung đột.

Go giao tiếp trực tiếp với vi xử lý bằng mã nhị phân (binaries)

Chúng ta có thể thấy rõ hiệu suất (performance) của ngôn ngữ C và C++ hơn hẳng so với Java hay Python bởi vì C/C++ là ngôn ngữ lập trình biên dịch (compiled programming language) chứ không phải là ngôn ngữ thông dịch (interpreted programming language).

Biên dịch là sao và thông dịch là như thế nào thì các bạn có thể tham khảo hình bên dưới.

Golang là gì và tại sao bạn nên học Go?

Các vi xử lý (Processors) chỉ hiểu các lệnh ở dạng nhị phân (binaries), mà lập trình viên chúng ta thì sử dụng các ngôn ngữ mà con người có thể đọc được nhưng vi xử lý của máy tính thì lại không, vì vậy các chương trình sau khi được code xong bởi bàn tay khéo léo của các lập trình viên thì nó sẽ được chuyển sang mã máy ở dạng nhị phân (binaries) bằng cách này hay cách khác, để vi xử lý có thể hiểu được.

Ở các ngôn ngữ biên dịch (Compiled) như C, C++, Go, Pascal thì code sẽ được chuyển (Compiling) sang mã máy ở dạng các bit nhị phân (binaries) 10110011 gì đấy và sẵn sàng để chạy ngay và luôn.

Với các ngôn thông dịch (Interpreted) như Python, PHP, Ruby, Javascript thì code khi thực thi sẽ được chuyển sang byte code, với mã byte code thì trình thông dich (virtual machines) mới hiểu được,  sau đó trình thông dịch này sẽ tiếp tục chuyển sang dạng nhị phân (binaries) để mà vi xử lý máy tính có thể hiểu được.

Go là ngôn ngữ biên dịch (Compiled) nên code sẽ được chuyển sang dạng (binaries) để thực thi chứ không cần thông qua trình thông dịch nữa, nên nó sẽ tăng được hiểu suất làm việc. Go là ngôn ngữ lập trình cấp cao nhưng nó có hiệu suất (performance) tốt cũng gần bằng các ngôn ngữ lập trình cấp thấp hơn như C, C++.

Code Go rất dễ dàng bảo trì và mở rộng

Go là ngôn ngữ lập trình phải nói là tinh gọn trong từng cú pháp, ít có những cú pháp dài dòng hay điên khùng như các ngôn ngữ lập trình khác.

Những người thiết kế ngôn ngữ Go tại Google luôn phải suy nghĩ 1 điều trong đầu, bởi Google là một công ty lớn và có hàng ngàn developer làm việc trên cùng một mã nguồn, vì thế code được thiết kế ra phải thật sự đơn giản, dễ đọc, dễ hiểu và hạn chế các thay đổi bên ngoài hàm (side effect) để các developer làm việc chung với nhau một cách nhanh và hiệu quả nhất.

Go đã lượt bỏ rất nhiều tính năng của các ngôn ngữ lập trình hướng đối tượng (OOP) hiện đại.

Mọi thứ được phân chia bằng các gói (packages), Go không có class mà thay vào đó Go có struct như ngôn ngữ C/C++.

Go không hỗ trợ việc kế thừa sẽ giúp code dễ dàng thay đổi. Đối với các ngôn ngữ như Java hay Python thì khi class CON kế thứ class CHA thì khi thay đổi class CHA thì sẽ có một số ảnh hưởng (side effects) tới các class CON được kế thừa từ CHA. Để code Go dễ hiểu hơn thì nó đã loại bỏ đi tính kế thừa.

Go không có hàm khởi tạo (constructors).

Go không có chú thích (annotations) như Java, nếu các bạn không hiểu thì có thể tìm kiếm trên Google để biết thêm các khái niệm này nhé.

Go không có generics, generics là loại kiểu chung chung đại diện cho một kiểu dữ liệu nào đó chưa biết trước, người ta hay đặt là kiểu T.

Go không có exception nhưng có error, đồng nghĩa với việc không có cú pháp try/catch.

  Chiến trường sinh tử phiên bản lập trình : Python vs Ruby vs Golang
  Mẫu bảng mô tả công việc cho lập trình Golang

Đứng phía sau Go là Google

Ngôn ngữ lập trình Go được thiết kế và hỗ trợ bởi Google. Google là một trong những công ty có cơ sở hạ tầng về clound server lớn nhất trên thế giới và nó đòi hỏi khả năng mở rộng (scalability) và tính hiệu quả cao vì thế Golang được thiết kế để giải quyết các vấn đề đó.

Go cũng được sử dụng tại các công ty lớn như BBC, IBM, Intel.

Tóm lại:

Mặc dù Go hơi khác biệt so với các ngôn ngữ lập trình hướng đối tượng nhưng nó vẫn chất lừ. Nó mang đến hiệu suất (performance) tốt như C/C++ và có trải nghiệm tốt khi viết code nhờ cú pháp tinh gọn như Python.

Để cải thiện hiệu suất của ứng dụng đừng ép phần cứng (hardware) phải làm việc cực lực mà hãy chia sẻ một phần gánh nặng đó cho các đoạn code, khi đó người dùng sẽ có trải nghiệm tốt hơn nhưng chi phí bỏ ra lại rẻ hơn.

Các ngôn ngữ khác có khái niệm song song(paralleism) còn go có khái niệm đồng thời (concurrency) vậy paralleism có khác gì so với concurrency không, mình sẽ tìm hiểu và chia sẻ vơi các bạn ở bài viết tiếp theo nha.

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

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

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

Hội thảo Khoa học Việc làm – Webinar Series: Future Is Made In Finland

Bạn đã từng bắt đầu cuộc hành trình tìm ra cách kiến tạo tương lai bằng các cơ sở khoa học? Những dữ liệu nào được vận dụng để hiện thực hóa các giải pháp? Hội thảo Future Is Made In Finland sẽ cung cấp cho các bạn cái nhìn toàn cảnh về những bài học thực tiễn, các nguồn dữ kiện xoay quanh sự tiếp cận với thế giới, các bài học phát triển nhận thức, đào tạo chuyên sâu nhằm hướng đến việc định hình khoa học về tư duy.

Điều gì đặc biệt ở Chuỗi Hội thảo – Webinar Series: Future Is Made In Finland?

Chuỗi hội thảo trên cung cấp các cơ hội học tập, nghiên cứu, làm việc và hợp tác tại Phần Lan. Đồng thời, chúng tôi nhấn mạnh tầm quan trọng của một số lĩnh vực nghiên cứu và công nghệ. Bên cạnh đó, một số cách tiếp cận nổi bật ở thời điểm hiện tại được đội ngũ chúng tôi khai thác nhằm phát triển nâng cao quá trình chuyển đổi về một tương lai bền vững hơn. Chúng bao gồm AI, 5G/6G, quang tử và hình ảnh, kinh tế tròn, tư duy thiết kế. Tất nhiên, việc trải nghiệm học tập được thiết lập dựa trên sự đa dạng và bình đẳng. 

Chúng tôi mở đăng ký chào đón tất cả những cá nhân có mong muốn trải nghiệm và tiếp cận hội thảo khoa học này. Bạn không chỉ là người học tập mà bạn còn là người hội nhập, thử sức trong một cuộc chơi với các chuyên gia đầu ngành. Vì thế, hãy tự mở ra cơ hội cho chính mình ngày hôm nay!

Thông tin chi tiết chuỗi Hội Thảo 

Mở đầu cho chuỗi Hội thảo là tập đầu tiên bắt đầu từ thứ Tư tuần sau, ngày 14 tháng 10 lúc 16:00  theo giờ Việt Nam.

Chuỗi Hội Thảo trên web đầy đủ sẽ như sau:

  • 14/10/2020 – 16h, EP I: Future is Made in Finland – want to be part of it?
  • 26/10/2020 – 17h, EP II: Bioeconomy Defines the Future
  • 28/10/2020 – 17h, EP III: Join the Revolution of Light and Image
  • 3/11/2020 – 17h, EP IV: First in 6G
  • 11/11/2020 – 17h, EP V: Get REAL, AI!
  • 17/11/2020 – 17:00, EP VI: Future is Mad in Finland – Design it yourself!
  • [To be announced] EP VII: Future is Female – Discussion with Women in Sciences & Tech

Hãy tham gia cùng chúng tôi khám phá tương lai thông qua 7 giai đoạn tuyệt vời để hiểu về sự thay đổi, các thách thức đang tồn tại; cách mà khoa học đang giải quyết các vấn đề về các hệ sinh thái phát triển hàng đầu trên thế giới.

Tìm hiểu chi tiết thông tin về chuỗi Hội thảo và đăng ký ngay tại: https://www.studyinfinland.fi/future-is-made-in-finland

Bàn cân doanh nghiệp: Kỷ luật và động lực, cái nào quan trọng?

Chủ động nâng cao năng suất là một điều cần thiết mà mỗi doanh nghiệp cần phải quan tâm, thực hiện. Và việc áp dụng kỷ luật; truyền động lực là hai cách thức hiệu quả nhất để tăng năng suất. Tuy vậy, nhà quản lý sẽ đứng trước nhiều thách thức về tính cân bằng giữa hai hình thức giải pháp này. Cùng TopDev tìm hiểu về tầm quan trọng giữa chúng. 

Bản chất của 2 át chủ bài quan trọng: Kỷ luật – Động lực

Kỷ luật được tạo ra nhằm hướng đến sự ổn định toàn diện về quy chế và lối ứng xử chung trong công sở. Điều này góp phần tạo ra giá trị thực – một phần cốt lõi của văn hóa danh nghiệp. Nó cần có, thật sự cần có. Và tất nhiên, kỷ luật cần được hoàn thiện dựa trên các cơ sở pháp lý sẵn có.

kỷ luật và động lực

Kỷ luật giúp thắt chặt và thúc đẩy tinh thần trách nhiệm. Đồng thời, tạo cơ hội để mỗi nhân viên phát triển bản thân một cách toàn diện. Dù vậy, kỹ luật vẫn có những đặc tính riêng cần đảm bảo: Tính bắc buộctính hệ thống.

Song, dù nói gì kỷ luật vẫn là một trong những cách tốt nhất để duy trì hiệu quả công việc. Bởi lẽ, kỹ luật giúp nhân viên gia tăng sự tự tin, kiên nhẫn và dạy mỗi chúng ta cách vượt qua thất bại. 

Động lực là yếu tố cần thiết mà mọi tổ chức cần phải quan tâm. Càng tạo nhiều động lực, bạn sẽ có cơ hội để thể hiện bản thân nhiều hơn. Đó cũng chính là cơ hội để bạn khám phá bản thân của mình.

Tại sao lại như thế? Đơn giản vì động lực làm kích thích khả năng học hỏi của con người. Đó là mấu chốt quan trọng tạo nên cá mong muốn chính đáng từ nhân viên – Tính thúc đẩy động lực từ nhà quản lý/chuyên gia nhân sự.

  Bí mật giúp tạo động lực và tăng năng suất cho nhân viên!
  4 cách thúc đẩy sự phát triển nhân viên tại công ty

Liệu có sự chênh lệch giữa “bàn cân”?

Thực tế chỉ ra rằng: Động lực rất dễ bị thay đổi! 

Điều quan trọng là bạn cần nhận ra các yếu tố chi phối động lực. Đó là lý do tại sao có những khoảng sống, bạn cảm thấy như mình mất đi động lực.

Xem thêm: Trí tuệ cảm xúc là gì và áp dụng như thế nào trong ngành Nhân sự

Hoặc bạn có từng nghĩ, điều gì sẽ xảy ra nếu bạn chưa thật sự kiểm soát được động lực. Nó cứ như cách bạn điều tiết nguồn năng lượng từ các cảm xúc khác nhau vậy. Bạn có thể vui, buồn, giận, hơn và động lực cũng thế. Khi quy chiếu vào thực tế, đôi lúc bạn có nhiều động lực và ngược lại, sẽ có lúc bạn sẽ thật tuyệt vọng.

Kỷ luật vẫn đang được quan tâm nhiều hơn?

Còn về kỷ luật thì sao? Nó khác động lực một chút? Vì cần thời gian để luyện tập và phát triển. Kỷ luật gắn liền với việc tuân thủ. Do vậy, bạn cần lưu tâm đến nó trong một khoảng thời gian nhất định.

kỷ luật và động lực

Nói cách khác, kỷ luật của bản thân được tạo nên từ cơ sở thói quen thực hiện. Chúng ta không áp đặt mọi thứ luôn theo khuôn khổ. Trường hợp tự thân thực hiện (tức tính kỷ luật của bản thân) vẫn có những nó không là mẫu số chung.  Đó chính là lý do tại sao kỷ luật tiếp tục đẩy chúng ta về phía trước. Trong khi động lực đôi khi lại làm chúng ta muốn từ bỏ mọi thứ! 

Việc tạo động lực và kỷ luật đều quan trọng để thành công. Thế nhưng, trong quản trị nhân sự, có lẽ kỷ luật vẫn là yếu tố được đặt lên hàng đầu. Vì nếu bạn trau dồi và rèn luyện cho nhân viên một cách đủ tốt, họ vẫn sẽ làm việc theo quy củ mỗi ngày. Tất nhiên, mọi thứ chỉ mang tính tương đối. Sự cân bằng vẫn luôn quan trọng để tạo nên sức mạnh thật sự của một tổ chức/doanh nghiệp. 

Kỷ luật & động lực – Sự kết hợp hoàn hảo

Mối tương quan giữa kỷ luật và động lực rất mạnh mẽ. Điều quan trọng là các nhà lãnh đạo nhân sự có nắm bắt được chúng hay không. 

Xem thêm: HR & IT – “Cuộc chơi” hoàn hảo cho việc thu hút và giữ chân nhân tài

kỷ luật và động lực

Trong một quỹ thời gian nhất định, các nhân viên sẽ rất cần kỷ luật để duy trì động lực. Về lâu dài, chính những thói quen nghiêm khắc sẽ giúp họ phát triển tốt hơn. Từ đó, nhân viên sẽ có cơ hội trải nghiệm, tiếp thu nhiều cái mới. Đồng thời, họ có nhiều động lực để khai phá tiềm năng của bản thân. Vì thế, động lực là thứ cần thiết để khởi động mọi thứ, giúp chúng ta sẵn sàng cho cuộc chơi chuyên nghiệp. kỷ luật là điều cần được duy trì để đảm bảo chúng ta đủ sức vượt qua các thách thức trên cuộc chơi chuyên môn ấy.

Làm thế nào để kết hợp hoàn hảo?

Để cho sự kết hợp này diễn ra hoàn hảo, một người quản lý cần ghi nhận và lắng nghe những phản hồi từ nhân viên của mình. Điều này giúp nhà lãnh đạo/quản lý hiểu được những mong muốn của nhân viên cả về 2 khía cạnh. Khi có những đóng góp, nhà quản lý sẽ biết cách điều chỉnh các nội quy về kỷ luật, biết cách tạo ra những lợi ích thiết thực đáp ứng nhu cầu về sự đồng hành và phát triển lâu dài của mỗi ứng viên.

kỷ luật và động lực

Hãy nhớ cân bằng mọi thứ! Áp dụng và phát huy tính triệt để từ hệ thống kỷ luật là một điều tốt. Song, vẫn phải quan tâm đến các hệ giá trị khác của nhân viên: phúc lợi, văn hóa doanh nghiệp, sự thăng tiến,…

Nếu một tổ chức mà thành công về mặt quản lý nhưng không tạo được động lực (truyền cảm hứng) thì doanh nghiệp ấy sớm muộn cũng sẽ nhanh chóng rơi vào bế tắc mà thôi   

Lời kết

Mọi sự quan tâm nên được cụ thể hóa thành những hành động. Đó cũng chính là nhiệm vụ của mỗi nhà quản lý/lãnh đạo nhân sự. Hãy kết hợp tốt kỷ luật và động lực; đảm bảo tính công bằng để tạo ra tính ổn định, sự bền vững nhất cho tổ chức/doanh nghiệp của mình. TopDev hy vọng bài viết đã có những phân tích bổ ích cho bạn đọc. Đặc biệt là những cá nhân đang hoạt động trong lĩnh vực nhân sự. Hãy nhớ rằng, kỷ luật và động lực luôn có mối liên hệ đặc biệt. Và chúng ta cần làm là dành cho chúng một sự đầu tư đúng mực.


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

Có thể bạn quan tâm

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

9 trang web mà bất kỳ developer nào cũng nên theo dõi

Tác giả: David Allen

1. Kho lưu trữ GitHub

9 trang web mà bất kỳ developer nào cũng nên theo dõi

GitHub không yêu cầu các lập trình viên phần mềm giới thiệu về mình, đó là nền tảng để developer build các dự án mã nguồn mở.  

https://github.com/

Sử dụng GitHub bạn có thể:

  • Chia sẻ code với mọi người ở nhiều nơi trên khắp thế giới.
  • Đóng góp vào các dự án mã nguồn mở.
  • Tạo website miễn phí trên nền tảng GitHub pages.
  • Một profile ấn tượng trên GitHub giúp gia tăng cơ hội tìm được những việc làm tốt cho bản thân.
  10 trang web hàng đầu để tìm hiểu WordPress
  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer

2. Trang web tin tức Hacker News

https://news.ycombinator.com/ 

9 trang web mà bất kỳ developer nào cũng nên theo dõi

Hacker News là một nền tảng cho phép các dev chia sẻ link và cùng thảo luận về các link đó. Hầu hết các chia sẻ đó đều liên quan đến Silicon Valley, Entrepreneurship, and Tech.

Sử dụng Hacker News cho phép người dùng cập nhật sớm nhất hệ sinh thái công nghệ của Silicon Valley và Hoa Kỳ. Các cuộc thảo luận trên Hacker News đều đã trải qua kiểm duyệt nên đáng tin cậy hơn.

3. Single page app DevDocs.IO

https://devdocs.io/ 

9 trang web mà bất kỳ developer nào cũng nên theo dõi

DevDocs.IO là một single-page app mã nguồn mở cho phép tìm kiếm tất cả tài liệu về các ngôn ngữ và frameworks lập trình phổ biến nhất.

Với DevDocs.IO, bạn có thể tìm kiếm được tất cả các loại tài liệu theo một cách nhanh nhất và kể cả khi đang hoạt động offline.

Xem thêm Single Page App không hề tệ như bạn nghĩ

4. Nền tảng học trực tuyến Udemy

https://www.udemy.com/ 

9 trang web mà bất kỳ developer nào cũng nên theo dõi

Udemy là một trong những trang web giảng dạy bằng video lớn nhất trên thế giới, với lượng video bài giảng về công nghệ cực kỳ lớn. Sử dụng Udemy sẽ giúp bạn học thêm các skill mới khi làm developer.

5. Website cho các Startuper ProductHunt

https://producthunt.com/ 

9 trang web mà bất kỳ developer nào cũng nên theo dõi

ProductHunt là website mà các dev và các công ty phát hành những trang web hoặc app mà họ đã build được. Khi sử dụng ProductHunt bạn sẽ biết có bao nhiêu website, bao nhiêu app được phát hành mỗi ngày cũng như có thể tự mình cho ra mắt web hoặc app mình đã build.

6. Nhà cung cấp dịch vụ Cloud Server DigitalOcean

https://digitalocean.com/ 

9 trang web mà bất kỳ developer nào cũng nên theo dõi

DigitalOcean cung cấp dịch vụ lưu trữ cho phép bạn lưu trữ servers, cơ sở dữ liệu,… Đây là nền tảng đã được nhiều dev sử dụng. Bạn nên sử dụng DigitalOcean khi: đang thực hiện các project cá nhân, muốn có giao diện dễ sử dụng.

7. Tổng hợp blog engineering diff.blog

http://diff.blog/ 

9 trang web mà bất kỳ developer nào cũng nên theo dõi

diff.blog là công cụ tổng hợp các blog về engineering. Website này có hàng ngàn bài blog về engineering và dev được tổng hợp (kể cả các blog trên dev.to).

Tại sao nên sử dụng diff.blog?

  • Bạn có thể theo dõi được tất cả các blog engineering của những công ty công nghệ và các lập trình viên trên thế giới.
  • Nếu đang sở hữu một blog về software engineer, bạn có thể giới thiệu về nó trên website diff.blog để thu hút được lượng người theo dõi đổ về trang mình.

8. Tổng hợp các tips phỏng vấn trên Leetcode

https://leetcode.com/ 

9 trang web mà bất kỳ developer nào cũng nên theo dõi

Leetcode giúp bạn tìm kiếm nhiều tips, lời khuyên cho cuộc phỏng vấn việc làm của mình. Trên nền tảng này, bạn có thể thực hành viết code trước khi đi phỏng vấn, kinh nghiệm thực tế của những người đi trước sẽ giúp bạn làm tốt hơn.

9. Network StackExchange

https://stackexchange.com/ 

StackExchange

StackOverflow.com và AskUbuntu rất nổi tiếng trong cộng đồng dev, nhưng ít người biết rằng 2 trang này đều là thành viên trong network StackExchange. Và vẫn còn rất nhiều các trang web khác trong network của StackExchange mà mình vẫn hay theo dõi như:

Tại sao nên sử dụng StackExchange mà không phải là Stackoverflow?

  • Nó giúp cải thiện các kỹ năng viết phần mềm.
  • Giúp giải quyết nhiều thắc mắc của các devs.
  • Thể hiện được nhiều kỹ năng của bạn bằng cách kết nối tài khoản StackExchange với resume hoặc website mà bạn đang sở hữu.

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

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

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

TopDev Challenge đấu trường quốc tế dành riêng cho Tech-Fresher Việt Nam

TopDev Challenge lần đầu tiên khởi động vào tháng 10/2020 kết hợp cùng nền tảng HackerRank hứa hẹn một sân chơi chuyên nghiệp, công bằng, trực quan không cảm tính hay thiên vị dành riêng cho Tech Fresher sẵn sàng đương đầu thử thách!

Theo chân TopDev đến với HackerRank – nền tảng có đến 11M+ coder trên toàn thế giới tin tưởng chọn để kiểm tra năng lực của mình. Nếu đây từng là nơi “luyện code” nay đã trở thành một đấu trường cạnh tranh năng lực cùng những món quà hấp dẫn “dân công nghệ Việt” không tài nào bỏ qua.

Cơ chế cuộc thi

TopDev Challenge 2020 diễn ra trong tháng 10 gồm có 03 Round riêng lẻ:

  1. Qualification Round 01
    • Thời lượng: 9:00 – 21:00 | ngày 10/10/2020
    • Tranh giải TOP 3 / 200 thí sinh
    • TOP 20 đặc cách vào vòng Final

2. Qualification Round 02

    • Thời lượng: 9:00 – 21:00 | ngày 17/10/2020
    • Tranh giải TOP 3 / 200 thí sinh
    • TOP 20 đặc cách vào vòng Final

3. Final Round

    • Thời lượng: 9:00 – 11:00 | ngày 29/10/2020
    • Tranh giải TOP 3 / 40 thí sinh chọn ra người thắng chung cuộc
  HackerRank là gì? Lời khuyên khi tham gia HackerRank
  Ra mắt Nền tảng kết hợp tuyển dụng và đánh giá ứng viên IT chuẩn quốc tế đầu tiên tại Việt Nam TopDev x HackerRank

Hình thức dự thi:

  • Nền tảng thi, Run code, Submit bài, Chấm điểm, công bố kết quả tại: HackerRank.com
  • Lưu ý: HackerRank có phần “Điểm phạt” theo số lần Submit bài thi.
  • Một Round (Vòng thi) bao gồm nhiều Challenges (Câu hỏi). Thí sinh được phép thi trong 12 giờ (Round 1-2-3) và trong 60 phút (Final Round).

Làm thế nào để tham gia?

  • Đăng ký dự thi tại https://meetup.vn/e/VeQ (Hạn cuối đăng ký: 1 ngày trước ngày diễn ra các vòng | Giới hạn 200 thí sinh đầu tiên)
  • Thí sinh tự tạo tài khoản tại https://www.hackerrank.com/auth/signup
  • Nhận link cuộc thi và Hướng dẫn tham gia qua email đăng ký trước Vòng thi 01 ngày
  • Công bố Leaderboard và trao giải sau khi TopDev Challenge 2020 kết thúc

Cơ cấu giải thưởng

Xem thêm tại: https://topdev.vn/page/topdev-challenge

[Bạn đã biết? “Đã làm Lập trình viên thì phải biết đến HackerRank để tập luyện.”]

HackerRank.com – nền tảng đã có đến 11M+ coder tài năng trên toàn thế giới tin tưởng lựa chọn để kiểm tra năng lực, thi đấu với nhau, nếu bạn còn chưa biết đến platform này, hẳn sẽ còn nhiều điều đang đợi bạn khai phá! Bởi hiện tại, nhiều công ty lớn trên thế giới đang sử dụng nền tảng HackerRank như một công cụ hỗ trợ tuyển dụng như Facebook, Quora, Shopify, Booking.com, WePay, VMware, Red Hat,…

TopDev – Việc Làm IT Hàng Đầu : được biết đến là đơn vị đầu tiên mang chương trình đánh giá ứng viên IT uy tín nhất thế giới đến Việt Nam cùng hệ thống trang tuyển dụng đã tích hợp HackerRank ngay trên nền tảng của TopDev.

Thông tin sự kiện

Tất tần tật về độ ưu tiên trong CSS

Tất tần tật về độ ưu tiên trong CSS

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

Có bao giờ các bạn code CSS cho một site nào đó của bạn bè hoặc dự án công ty. Nhưng code CSS xong rồi nó lại không nhận, mặc dù đã đúng đường dẫn, check thấy rõ ràng nhưng lại không được kết quả như mong muốn. Và bạn nhận ra rằng ah thì ra có 1 đoạn code CSS ai đã code trước đó sử dụng #idinline style hoặc !important

Ai dè mình code hoài sửa hoài mà CSS của mình nó không có chạy. Lúc này bạn mới nhận ra rằng độ ưu tiên trong CSS nó rất là quan trọng. Vì thế hôm nay chúng ta sẽ cùng tìm hiểu tất tần tật về độ ưu tiên trong CSS nó như thế nào nhé

  3 điều bạn có thể không biết về biến trong CSS
  11 công cụ hữu ích để kiểm tra và tối ưu hóa các file CSS

# Độ ưu tiên trong css

Giả sử bây giờ chúng ta có đoạn code HTML và CSS đơn giản như sau

Các bạn đoán thử xem. Kết quả ra 10px hay là 14px ? Mình nghĩ hầu hết các bạn  sẽ đoán đúng là 14px đúng không nào.

Thứ nhất là vì nó nằm dưới nên độ ưu tiên nó cao hơn, thứ hai là nó có thêm class .text kèm theo nữa. Chà dễ quá dễ, nếu như vậy thì cần gì phải học nhỉ. Đừng vội mừng. Tiếp tục xem ví dụ dưới đây nà.

Ấy chà chà khó hơn rồi đây. Không code chạy thử nhé vì chúng ta cần hiểu và làm chớ code ra thì dễ rồi. Chỗ này người nào đã từng làm nhiều thì sẽ biết ngay thôi tuy nhiên người mới sẽ nghĩ là chắc là font-size: 14px rồi vì nó có 3 cái luôn như là thẻ div bọc ngoài rồi đến thẻ p kèm theo class .text chắc chắn là ưu tiên hơn ở dưới rồi.

Nhưng kết quả lại không nghiêng về người mới. Kết quả là người có kinh nghiệm đúng là font-size: 20px .Tại sao ? Tại vì #id nó ưu tiên hơn thẻ bình thường hơn class nên nó sẽ lấy CSS đoạn ở dưới thôi. Vì sao lại thế thì bạn nên hỏi người tạo ra CSS nha kaka

# Câu chuyện nhỏ nho

Để rõ ràng hơn về độ ưu tiên này trong CSS thì mình làm câu chuyện nho nhỏ như sau cho các bạn dễ hình dung. Giả sử các bạn đang xếp hàng có 4 người mua bánh. A (anh bạn) B (Bạn) C (Chú bạn) D (Dì bạn) thì bây giờ theo thứ tự ưu tiên sẽ là A B C D hen.

Đầu tiên là các elements(thẻ) trong CSS như là thẻ pdivsection , header … thì độ ưu tiên trong CSS của nó nằm cuối ta có (0A, 0B, 0C, 1D)

Tiếp theo là các class, pseudo class như .home , .content , :hover , :before , :after hoặc các attribute(thuộc tính) như a[target="_blank"]input[type="text"]a[href^="http"]… thì độ ưu tiên của nó nằm kế cuối ta có (0A, 0B, 1C, 0D)

Tiếp đến là các id như #header#banner nó có độ ưu tiên thứ nhì ta được (0A, 1B, 0C, 0D)

Và cuối cùng là inline-style. Nghĩa là code trực tiếp bên trong thẻ HTML luôn như này và nó có độ ưu tiên cao nhất ta được (1A, 0B, 0C, 0D)

Giờ nhìn lại vào đoạn code khi nãy thì thấy đoạn code ở dưới có độ ưu tiên cao hơn cho nên nó sẽ chạy đoạn code đó #header p đó. Vì sao vì lúc này thèn 1B(bạn) đứng trước ưu tiên nhất và đoạn code trên có 0B cho nên độ ưu tiên thấp hơn và bạn đừng quan tâm con số 2D hay 1D vì nó đã nằm cuối là độ ưu tiên thấp nhất ko quan trọng là bao nhiêu số nhé.

Cho dù bạn code như thế này thì cái số 5 đó không có nghĩa lý gì khi nó vẫn đứng cuối. Còn thằng đứng cao hơn nó là đoạn code ở dưới có #id đó vẫn ưu tiên hơn. Giống như lúc xếp hàng, bạn đã được xếp đứng đầu thì cho dù thằng đứng cuối cao hơn bạn 5m thì nó vẫn đứng chót và độ ưu tiên vẫn thua bạn mà thôi.

À còn 1 điểm nữa nếu như mình muốn đoạn code div p.text đè được đoạn code ở dưới mà không muốn thêm elements hay id thì sao. Tức là Dì bạn muốn mua trước bạn đó. Tất nhiên là có cách và đó chính là !important. Kiểu như Dì bạn có ngôi sao hi vọng hay quyền ưu tiên vì lớn tuổi nên dì bạn sử dụng chúng để mua hàng trước bạn.

Cho nên khi sử dụng thêm !important(quan trọng) lúc này nó sẽ có độ ưu tiên cao nhất luôn cao hơn cả cái inline style

Cho nên lúc này đoạn code trên sửa lại như này và nó sẽ chạy đoạn code div p.text và dì bạn sẽ mua được bánh trước bạn. Nhưng bạn đứng trước mà bạn muốn mua trước nên vì thế bạn cũng có thể sử dụng !important

Thì lúc này nó ngang hàng về mặt !important coi như ta bỏ nó ra rồi so sánh như ở trên ban đầu thôi. Và tất nhiên là đoạn code ở dưới có thêm #header p (là bạn đó) sẽ đè đoạn ở trên rồi. Haha mua được bánh rồi nhóe.

# Lưu ý

Trước khi kết thì còn vài điểm nữa là nếu trường hợp cả 2 đoạn code đều có thẻ #id ưu tiên như nhau thì lúc này nó sẽ xét số lượng các thẻ còn lại như vầy. Đoạn code này nó sẽ ưu tiên đoạn ở trên nha. Lúc này độ ưu tiên về #id như nhau nên nó sẽ xem xét các số lượng thẻ còn lại(4D > 2D) nên nó ưu tiên hơn nà.

Trường hợp tất cả đều bằng nhau thì nó sẽ ưu tiên đoạn code ở dưới nhé. Vì độ ưu tiên trong CSS chạy từ dưới lên

Thế trường hợp như này các bạn nghĩ là cái nào nà. Rõ ràng là đoạn code trên ưu tiên hơn vì so sánh như sau: 0A = 0A, 1B = 1B, 1C > 0C, 4D = 4D. Làm lâu riết các bạn sẽ dễ dàng nhận ra luôn mà không cần phải tính toán nhiều.

Đặc biệt là khi các bạn custom CSS cho WordPress. Code nó bao dài luôn. Đòi hỏi các bạn phải hiểu để dùng cho đúng chứ không nên lạm dụng !important nhé. Nó chỉ dùng trong trường hợp bắt buộc, không thể tìm được độ ưu tiên nào khác cao hơn cái gốc nữa mới dùng nha.

Đây là một đoạn code dài khủng hoảng bên WordPress cho các bạn xem ví dụ để hiểu được rằng độ ưu tiên trong CSS nó quan trọng như thế nào. Bạn muốn đè đoạn code này ư ? Hãy phân tích nó từ các thẻ HTML và Class trong trang web nhé.

Một điểm lưu ý cuối cùng đó là Internal CSS và External CSS cụ thể là CSS nằm trong cặp thẻ <style>.code{}</style> bên trong HTML so với <link href=”css/style.css”> đường dẫn tới file CSS trong thư mục nào đó nếu thẻ nào nằm sau thì thẻ đó có độ ưu tiên cao hơn nhé.

# Lời kết

Hi vọng với câu chuyện vui nhộn kèm theo giải thích chi tiết sẽ giúp bạn hiểu được rõ ràng hơn về thứ tự độ ưu tiên trong CSS. Nó rất là quan trọng nên các bạn chú ý học chứ đừng bỏ qua nhé. Nếu có gì thắc mắc góp ý hoặc cám ơn thì cứ comment mình sẽ trả lời. Chúc các bạn một ngày tốt lành nà

Bài viết có tham khảo từ trang vanseodesigndotcom

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

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

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

Flex CSS là gì? Sử dụng bố cục trang Flexbox trong CSS

Sử dụng bố cục trang Flexbox trong CSS

Ở những bài học trước, mình đã hướng dẫn bạn cách thiết kế bố cục trang web bằng cách sử dụng thuộc tính float, kỹ thuật clear float hay đặt các position lồng nhau. Tuy nhiên phương pháp này thường phải viết khá nhiều code CSS và kết quả thì thực sự là khó đoán trước, có thể như ý bạn, cũng có thể cực kì… tệ.

Nhưng thật may mắn, Flexbox Layout đã ra đời để cải thiện những nhược điểm này. Với Flexbox, bạn có thể giải quyết rất nhiều vấn đề về dàn trang trong CSS một cách linh hoạt, dễ dàng và tiết kiệm thời gian chỉ bằng một vài dòng code. Vậy chúng ta cùng tìm hiểu xem Flexbox là gì và lý do tại sao nó lại mạnh mẽ như vậy?

Flexbox là gì?

Sử dụng bố cục trang Flexbox trong CSS

Flexbox Layout (còn gọi là Flexible Box hay CSS flexbox) là một kiểu bố cục trang có khả năng tự cân đối kích thước, thay đổi chiều rộng/chiều cao và thứ tự phần tử bên trong để phù hợp với tất cả các loại thiết bị hiển thị và kích thước màn hình.

Với bố cục thông thường, bạn cần phải thiết lập kích thước của phần tử, thiết lập hiển thị dạng block hay inline, cho nó float, còn với Flexbox bạn chỉ cần thiết lập phần hiển thị theo chiều ngang hay chiều dọc, lúc đó các phần tử bên trong có thể hiển thị theo ý muốn..

Lưu ý: Flexbox Layout phù hợp nhất để thiết lập bố cục ở quy mô nhỏ, còn thiết lập bố cục với phạm vi lớn hơn thì vẫn nên sử dụng kiểu thông thường là dàn trang theo dạng lưới (grid layout).

Các khái niệm cơ bản và thuật ngữ

Bố cục Flex được thiết lập từ một khung lớn (parent container) đóng vai trò là khung linh hoạt (flex containter) và các thẻ con ngay trong nó (immediate children) đóng vai trò các mục nhỏ linh hoạt (flex item).

Dưới đây là sơ đồ cấu trúc Flexbox:

Sử dụng bố cục trang Flexbox trong CSS

Thành phần quan trọng nhất của Flexbox là

  • container: là thành phần lớn bao quanh các phần tử bên trong, các item bên trong sẽ hiển thị dựa trên thiết lập của container này.
  • item: là phần tử con của container, bạn có thể thiết lập nó sẽ sử dụng bao nhiêu cột trong một container, hoặc thiết lập thứ tự hiển thị của nó.
Sử dụng bố cục trang Flexbox trong CSS Sử dụng bố cục trang Flexbox trong CSS

Các item sẽ được bố trí theo trục main axis (bắt đầu từ main-start, kết thúc ở main-end) hoặc theo trục cross axis (bắt đầu từ cross-start, kết thúc ở cross-end).

  • main axis: đây là trục chính để điều khiển hướng mà các item sẽ hiển thị. Lưu ý, main axis không phải lúc nào cũng nằm ngang như sơ đồ trên, bạn có thể sử dụng thuộc tính flex-direction để thay đổi hướng của trục và lúc đó các item sẽ hiển thị theo nó.
  • main-start | main-end: khi thiết lập flexbox, các item nằm trong container hiển thị từ điểm bắt đầu gọi là main-start tới điểm kết thúc gọi là main-end.
  • main size: kích thước (chiều rộng hoặc chiều cao) của các item, tùy thuộc vào hướng của main axis.
  • cross axis: cross axis luôn là trục vuông góc của main axis. Hướng của nó phụ thuộc vào hướng của main axis.
  • cross-start | cross-end: có ý nghĩa tương tự nhưng luôn vuông góc với main start, main end.
  • cross size: kích thước (chiều rộng hoặc chiều cao) của các item dựa trên trục cross axis, tùy thuộc vào hướng của main axis.
  3 điều bạn có thể không biết về biến trong CSS
  5 điều phiền toái nhất của CSS

Các thuộc tính của Flex Container

Sử dụng bố cục trang Flexbox trong CSS

display

Để sử dụng flex trong css thì đơn giản là chúng ta chỉ cần khai báo thuộc tính display: flex

.container {   display: flex; /* hoặc inline-flex */ }

Lưu ý: các cột CSS thông thường không sử dụng được trong flex container.

flex-direction

Thuộc tính flex-direction xác định hướng của main-axis để container sắp xếp các item.

Sử dụng bố cục trang Flexbox trong CSS Sử dụng bố cục trang Flexbox trong CSS

Cú pháp:

.container {    flex-direction: row | row-reverse | column | column-reverse;  }

Các tham số:

  • row: mặc định, flex item được sắp xếp theo chiều ngang, từ trái qua phải (main axis nằm ngang).
  • row-reverse: flex item được sắp xếp theo chiều ngang, từ phải qua trái (main axis nằm ngang).
  • column: flex item được sắp xếp theo chiều dọc, từ trên xuống dưới (main axis đứng dọc).
  • column-reverse: flex item được sắp xếp theo chiều dọc, từ dưới lên trên (main axis đứng dọc).

Ví dụ:

.flex-container {   display: flex;   flex-direction: row; }
.flex-container {   display: flex;  flex-direction: row-reverse; }
.flex-container {   display: flex;  flex-direction: column; }
.flex-container {   display: flex;  flex-direction: column-reverse; }

Code đầy đủ:

<!DOCTYPE html> <html> <head> <style> .flex-container {   display: flex;   flex-direction: column;   background-color: #e9d8f4; } .flex-container > div {   background-color: #58257b;   width: 100px;   margin: 10px;   color: white;   text-align: center;   line-height: 75px;   font-size: 30px; } </style> </head> <body> <h1>Thuộc tính flex-direction</h1> <div class="flex-container">   <div>1</div>   <div>2</div>   <div>3</div>  </div> </body> </html>

flex-wrap

Sử dụng bố cục trang Flexbox trong CSS

Theo mặc định, item sẽ tự động thay đổi kích thước phần tử để nó luôn hiển thị trên cùng một dòng dù bạn có resize trình duyệt theo kích thước nào, điều này dễ làm cho nội dung bên trong (nếu có) bị giãn hay ép nhỏ lại, có thể gây xấu giao diện.

Vì vậy, ta có thuộc tính flex-wrap cho phép item tự động xuống dòng khi kích thước container thay đổi.

Cú pháp:

.container{    flex-wrap: nowrap | wrap | wrap-reverse;  }

Tham số:

  • nowrap: mặc định, tất cả các item sẽ nằm trên một dòng.
  • wrap: khi kích thước container thay đổi và tổng chiều rộng các item cộng lại lớn hơn chiều rộng của container thì item sẽ tự động xuống dòng.
  • wrap-reverse: tương tự như wrap, nhưng thay vì xuống dòng thì item sẽ tự động nhảy lên trên.

Ví dụ:

.flex-container {   display: flex;  flex-wrap: nowrap; }
.flex-container {   display: flex;  flex-wrap: wrap; }
.flex-container {   display: flex;  flex-wrap: wrap-reverse; }

Chạy code sau rồi thử resize trình duyệt để thấy rõ hơn sự khác biệt nhé:

<!DOCTYPE html> <html> <head> <style> .flex-container {   display: flex;   flex-wrap: wrap-reverse;   background-color: #e9d8f4; } .flex-container > div {   background-color: #58257b;   width: 100px;   margin: 10px;   color: white;   text-align: center;   line-height: 75px;   font-size: 30px; } </style> </head> <body> <h1>Thuộc tính flex-wrap</h1> <div class="flex-container">   <div>1</div>   <div>2</div>   <div>3</div>    <div>4</div>    <div>5</div>  </div> </body> </html>

flex-flow

Thuộc tính flex-flow sử dụng để gộp chung hai thuộc tính flex-direction và flex-wrap.

Cú pháp:

flex-flow: <'flex-direction'> || <'flex-wrap'>

Ví dụ:

.flex-container {   display: flex;   flex-flow: row wrap; }

justify-content

Sử dụng bố cục trang Flexbox trong CSS Sử dụng bố cục trang Flexbox trong CSS
Sử dụng bố cục trang Flexbox trong CSS Sử dụng bố cục trang Flexbox trong CSS
Sử dụng bố cục trang Flexbox trong CSS Sử dụng bố cục trang Flexbox trong CSS

Theo mặc định, các item bên trong sẽ bắt đầu từ main start đến main end, tuy nhiên, đôi khi container vẫn còn khoảng trống. Vì vậy, bạn có thể sử dụng thuộc tính justify-content để điều chỉnh vị trí bắt đầu và căn chỉnh các item bên trong container theo dọc theo trục main axis, chiều ngang hoặc chiều dọc tùy thuộc vào flex-direction.

Cú pháp:

.container {  justify-content: flex-start | flex-end | center | space-between |
                   space-around | space-evenly;  }

Các tham số:

  • flex-start: giá trị mặc định, item sẽ bắt đầu từ lề chính main-start của container.
  • flex-end: item sẽ bắt đầu từ lề chính main-end của container (khác với row-reverse là đổi hướng hiển thị).
  • center: item sẽ nằm giữa container.
  • space-between: các item sẽ có khoảng cách giữa các phần tử bằng nhau do container sẽ tự động căn khoảng cách, item đầu tiên sát lề chứa điểm main-start, item cuối cùng sát lề chứa điểm main-end.
  • space-around: tương tự space-between, nhưng khác ở chỗ là mỗi item có khoảng cách 2 bên cạnh và những khoảng cách này bằng nhau.
  • space-evenly: các item được phân phối sao cho khoảng cách giữa hai item bất kỳ, giữa item và các lề là bằng nhau.

Ví dụ: Ở đây main axis nằm ngang

.flex-container {   display: flex;  justify-content: flex-start; }
.flex-container {   display: flex;  justify-content: flex-end; }
.flex-container {   display: flex;  justify-content: center; }
.flex-container {   display: flex;  justify-content: space-between; }
.flex-container {   display: flex;  justify-content: space-evenly; }
.flex-container {   display: flex;  justify-content: space-around; }

Thay các giá trị vào code để thấy sự khác biệt nhé:

<!DOCTYPE html> <html> <head> <style> .flex-container {   display: flex;   justify-content: space-evenly;   background-color: #e9d8f4; } .flex-container > div {   background-color: #58257b;   width: 60px;   margin: 10px;   color: white;   text-align: center;   line-height: 75px;   font-size: 30px; } </style> </head> <body> <h1>Thuộc tính justify-content</h1> <div class="flex-container">   <div>1</div>   <div>2</div>   <div>3</div>  </div> </body> </html>

align-items

Sử dụng bố cục trang Flexbox trong CSS Sử dụng bố cục trang Flexbox trong CSS
Sử dụng bố cục trang Flexbox trong CSS Sử dụng bố cục trang Flexbox trong CSS

Thuộc tính align-items sử dụng để điều chỉnh vị trí bắt đầu và căn chỉnh các item bên trong container theo dọc theo trục cross axis, chiều ngang hoặc chiều dọc tùy thuộc vào flex-direction.

Cú pháp:

.container {    align-items: stretch | flex-start | flex-end | center | baseline;  }

Các tham số và ví dụ minh họa

stretch: giá trị mặc định, các phần tử sẽ được kéo dài để lấp đầy container chứa nó, nhưng sẽ ưu tiên giá trị height/width nếu có, khi đó item sẽ không cao full mà chỉ lấy giá trị height/width mà bạn set.

.flex-container {   display: flex;  align-items: stretch; }

Sử dụng bố cục trang Flexbox trong CSS

flex-start: item sẽ bắt đầu từ lề cross-start của container.

Ví dụ trường hợp mặc định với main axis nằm ngang, cross axis đứng dọc, flex-direction: row thì các item sẽ bắt đầu từ trên.

.flex-container {   display: flex;  align-items: flex-start; }

Sử dụng bố cục trang Flexbox trong CSS

flex-end: item sẽ bắt đầu từ lề cross-end của container. Trường hợp mặc định với cross axis đứng dọc, flex-direction: row thì các item sẽ dồn xuống dưới.

.flex-container {   display: flex;  align-items: flex-end; }

Sử dụng bố cục trang Flexbox trong CSS

center: item sẽ căn giữa theo chiều của cross axis.

.flex-container {   display: flex;  align-items: center; }

Sử dụng bố cục trang Flexbox trong CSS

baseline: item được căn chỉnh theo đường cơ sở của chúng.

Đường cơ sở là đường mà tất cả các chữ cái sẽ “ngồi lên”. Bạn có thể sử dụng kích thước font chữ khác nhau để thấy rằng các mục được căn chỉnh theo đường cơ sở baseline:

.flex-container {   display: flex;  align-items: baseline; }

Sử dụng bố cục trang Flexbox trong CSS

Code đầy đủ, thay các giá trị để thấy rõ hơn.

<!DOCTYPE html> <html> <head> <style> body { font-family: arial; } .flex-container {   display: flex;   height: 200px;   align-items: center;   background-color: #e9d8f4; } .flex-container > div {   background-color: #58257b;   width: 100px;   margin: 10px;   color: white;   text-align: center;   line-height: 75px;   font-size: 30px; } </style> </head> <body> <h1>Thuộc tính align-items</h1> <div class="flex-container">   <div>1</div>   <div>2</div>   <div>3</div>    <div>4</div>    </div> </body> </html>

align-content

Sử dụng bố cục trang Flexbox trong CSS
Sử dụng bố cục trang Flexbox trong CSS Sử dụng bố cục trang Flexbox trong CSS

Thuộc tính align-content sử dụng để căn chỉnh khoảng cách các item bên trong container theo dọc theo trục cross axis, chiều ngang hoặc chiều dọc tùy thuộc vào flex-direction.

Cú pháp:

.container {   align-content: flex-start | flex-end | center | space-between | 
                 space-around | stretch;  }

Các tham số:

flex-start: item sẽ bắt đầu từ lề chứa cross-start của container.

.flex-container {   display: flex;   flex-wrap: wrap;   align-content: flex-start; }
flex-end: item sẽ bắt đầu từ lề chứa cross-end của container.

.flex-container {   display: flex;   flex-wrap: wrap;   align-content: flex-end; }
center: item sẽ nằm giữa container căn theo cross-axis.

.flex-container {   display: flex;   flex-wrap: wrap;   align-content: center; }
space-between: các item sẽ có khoảng cách giữa các phần tử bằng nhau do container tự động căn khoảng cách, item đầu tiên sát lề chứa cross-start, item cuối cùng sát lề chứa cross-end.

.flex-container {   display: flex;   flex-wrap: wrap;   align-content: space-between; }
space-around: tương tự space-between, nhưng khác ở chỗ là mỗi item có khoảng cách 2 bên cạnh và những khoảng cách này bằng nhau.

.flex-container {   display: flex;   flex-wrap: wrap;   align-content: space-around; }
stretch: giá trị mặc định, các phần tử sẽ được kéo dài, căn chỉnh sao cho lấp đầy container chứa nó (vẫn ưu tiên giá trị height/width nếu có).

.flex-container {   display: flex;   flex-wrap: wrap;   align-content: stretch; }

Code đầy đủ:

<!DOCTYPE html> <html> <head> <style> .flex-container {   display: flex;   height: 320px;   flex-wrap: wrap;   align-content: stretch;   background-color: #e9d8f4; } .flex-container > div {   background-color: #58257b;   width: 90px;   margin: 5px;   color: white;   text-align: center;   line-height: 75px;   font-size: 30px; } </style> </head> <body> <h1>Thuộc tính align-content</h1> <div class="flex-container">   <div>1</div>   <div>2</div>   <div>3</div>    <div>4</div>   <div>5</div>   <div>6</div>    <div>7</div>   <div>8</div>    <div>9</div>   <div>10</div> </div> </body> </html>

Các thuộc tính của Flex Item

Sử dụng bố cục trang Flexbox trong CSS

order

Theo mặc định, các item sẽ hiển thị theo thứ tự xuất hiện trong HTML, nhưng với thuộc tính order, bạn có thể sắp xếp lại vị trí sắp xếp của các item.

Sử dụng bố cục trang Flexbox trong CSS

Cú pháp:

.item {    order: <integer>; /* mặc định là 0 */  }

Ví dụ:

<div class="flex-container">   <div style="order: 3">1</div>   <div style="order: 2">2</div>   <div style="order: 4">3</div>    <div style="order: 1">4</div> </div>

Sử dụng bố cục trang Flexbox trong CSS

flex-grow

Sử dụng bố cục trang Flexbox trong CSS

Thuộc tính flex-grow cho phép các phần tử giãn theo độ rộng của container.

Cú pháp:

.item {   flex-grow: <number>; /* mặc định là 0 */  }

Thuộc tính này hơi phức tạp, Quantrimang sẽ minh họa một số trường hợp hay gặp cho bạn dễ hình dung hơn. Ví dụ ta set các item có độ rộng là 100px.

Sử dụng bố cục trang Flexbox trong CSS

Giá trị mặc định của thuộc tính flex-grow là 0, các item sẽ không tự động co giãn kích thước, để lại nhiều khoảng trống trong container.

Khi ta tăng flex-grow = 1, item sẽ tự động giãn ra đều nhau sao cho vừa với khung container.

Sử dụng bố cục trang Flexbox trong CSS

Giá trị của flex-grow rất linh động, khi set thuộc tính này cho tất cả các item với cùng một giá trị thì các item sẽ có tỉ lệ như nhau và được dàn đều lấp đầy container. Ví dụ set tất cả các phần tử flex-grow là 1 thì tất cả đều như nhau tỉ lệ 1:1, mà set flex-grow là 100 thì kết qua vẫn sẽ ra tương tự với tỉ lệ 1:1.

Nhưng điều thú vị hơn ở flex-grow là áp dụng nó cho từng item. Ta có giá trị mặc định ở tất cả phần tử là flex-grow = 0, thay đổi riêng giá trị của item2 thành 1, kết quả như sau:

Sử dụng bố cục trang Flexbox trong CSS

Vậy là ở đây, thiết lập flex-grow là 1 thì item2 sẽ lấy phần trống còn lại của container đắp vào chính nó.

Bây giờ hãy thử cho các phần tử đều là flex-grow: 1, nhưng set riêng phần tử thứ 3 giá trị khác:

Sử dụng bố cục trang Flexbox trong CSS

Lúc này thì tất cả các item đều được giãn ra lấp đầy phần trống của container, nhưng item3 có flex-grow: 3 sẽ được thừa hưởng nhiều phần trống hơn các item còn lại chỉ có flex-grow: 1, cụ thể là hơn khoảng 3 lần. Và như đã đề cập ở trên, thuộc tính flex-grow làm cho các phần tử tỉ lệ với nhau. Giả sử các item đều có flex-grow: 4 và item3 có thuộc tính flex-grow: 12 thì nó cũng tương tự như là 1 với 3.

Bạn tự thay đổi các giá trị để hiểu rõ hơn nhé.

  display: flex;   align-items: stretch;   background-color: #58257b; } .flex-container>div {   background-color: #e9d8f4;   color: #58257b;   margin: 5px;   text-align: center;   line-height: 75px;   font-size: 30px; } </style> </head> <body> <h4 style="text-align: center;">#all-item: flex-grow:1|#item3: flex-grow:3</h4> <div class="flex-container">   <div style="flex-grow: 1">1</div>   <div style="flex-grow: 1">2</div>   <div style="flex-grow: 3">3</div>   <div style="flex-grow: 1">4</div> </div> </body> </html>

flex-shrink

Thuộc tính flex-shrink ngược lại với thuộc tính flex-grow ở trên, nó không giãn ra mà lại co lại khi chúng ta thay đổi độ rộng của container.

Cú pháp:

.item {    flex-shrink: <number>; /* mặc định là 1 */  }

Giá trị mặc định trong flex-shrink là 1, cho phép các phần tử co lại bằng nhau khi độ rộng container giảm xuống. Nếu flex-shrink: 0 thì item sẽ không co giãn mà lấy nguyên giá trị của thuộc tính width/height.

Nếu muốn item3 nó co lại nhiều hơn so với các item khác thì tăng giá trị flex-shrink của nó lên.

Sử dụng bố cục trang Flexbox trong CSS

Resize cửa sổ trình duyệt nhỏ lại thì item3 co lại nhiều hơn:

Sử dụng bố cục trang Flexbox trong CSS

flex-basis

Thuộc tính flex-basis sử dụng để xác định độ dài ban đầu của một item.

Cú pháp:

.item {    flex-basis: <length> | auto; /* mặc định là auto */  }

Nếu bạn xác định độ dài chung của class item là 100px nhưng tùy chỉnh item3 với flex-basis: 250px thì ta sẽ được như sau:

Sử dụng bố cục trang Flexbox trong CSS

flex

Thuộc tính flex sử dụng để gộp chung ba thuộc tính flex-grow, flex-shrink và flex-basis.

Cú pháp:

.item {    flex: none | [ <'flex-grow'> <'flex-shrink'> || <'flex-basis'> ]  }

Thay vì phải sử dụng cả 3 thuộc tính:

.item {    flex-grow: 1;    flex-shrink: 3;    flex-basis: 250px;  }

Thì bạn có thể sử dụng thuộc tính flex một cách ngắn gọn:

flex: 1 3 250px;

Giá trị mặc định của flex là:

flex: 0 1 auto;

Lưu ý:

  • Nếu thuộc tính chỉ có một tham số thế này: flex: 1; thì ta hiểu đó là flex-grow.
  • Nếu thuộc tính chỉ có một tham số có đơn vị độ dài như thế này: flex: 250px; thì ta hiểu đó là flex-basis.
  • Nếu thuộc tính có hai tham số thế này: flex: 1 250px; thì ta hiểu đó là flex-grow và flex-basis.
  • Nếu thuộc tính có hai tham số thế này: flex: 1 2; thì ta hiểu đó là flex-grow và flex-shrink.

align-self

Sử dụng bố cục trang Flexbox trong CSS

Thuộc tính align-self có tác dụng tương tự như align-items của phần container nhưng sử dụng riêng cho từng item, bạn có thể dùng nó để đặt lại vị trí cho một số item mà align-items đã quy định.

.item {    align-self: auto | flex-start | flex-end | center | baseline | stretch;  }

Align-self cũng có các giá trị giống như align-items đó là: flex-start, flex-end, center, stretch và baseline.

Ví dụ: Ta có 5 item đã được căn ra giữa nhờ align-items:center như sau:

Sử dụng bố cục trang Flexbox trong CSS

Bạn có thể căn chỉnh các item theo ý thích, item1 nằm ở trên cùng, item3 thì phải kéo giãn dài ra và item5 thì phải nằm dưới cùng, hãy dùng align-self để đặt lại các vị trí.

<div class="flex-container">   <div style="align-self: flex-start">1</div>   <div>2</div>   <div style="align-self: stretch">3</div>   <div>4</div>   <div style="align-self: flex-end">5</div> </div>

Sử dụng bố cục trang Flexbox trong CSS

Tạo thư viện ảnh sử dụng Flexbox

Sử dụng flexbox để tạo một bộ sưu tập ảnh hiển thị bố cục khác nhau tùy thuộc vào kích thước màn hình:

Sử dụng bố cục trang Flexbox trong CSS

Bạn tự chạy code, resize màn hình để xem kết quả nhé:

<!DOCTYPE html> <html> <style> * {   box-sizing: border-box; } body {   margin: 0;   font-family: Arial; } .header {   text-align: center;   padding: 32px; } .row {   display: flex;   flex-wrap: wrap;   padding: 0 4px; } /* Tạo bốn cột bằng nhau nằm cạnh nhau */ .column {   flex: 25%;   max-width: 25%;   padding: 0 4px; } .column img {   margin-top: 8px;   vertical-align: middle; } /* Bố cục linh hoạt: tạo bố cục 2 cột */ @media (max-width: 800px) { .column {   flex: 50%;   max-width: 50%; } } /* Bố cục linh hoạt: làm cho hai cột xếp chồng lên nhau thay vì cạnh nhau */ @media (max-width: 600px) { .column {   flex: 100%;   max-width: 100%; } } </style> <body> <!-- Header --> <div class="header"> <h1>Responsive Image Grid</h1> <p>Resize the browser window to see the responsive effect.</p> </div> <!-- Photo Grid --> <div class="row">    <div class="column">     <img src="flower-1.jpg" style="width:100%">     <img src="wedding-1.jpg" style="width:100%">     <img src="flower-2.jpg" style="width:100%">     <img src="wedding-2.jpg" style="width:100%">     <img src="flower-3.jpg" style="width:100%">     <img src="wedding-3.jpg" style="width:100%">     <img src="flower-4.jpg" style="width:100%">   </div>   <div class="column">     <img src="wedding-cake.jpg" style="width:100%">     <img src="wedding-4.jpg" style="width:100%">     <img src="wedding-5.jpg" style="width:100%">     <img src="flower-5.jpg" style="width:100%">     <img src="flower-6.jpg" style="width:100%">     <img src="wedding-6.jpg" style="width:100%">   </div>    <div class="column">     <img src="flower-1.jpg" style="width:100%">     <img src="wedding-1.jpg" style="width:100%">     <img src="flower-2.jpg" style="width:100%">     <img src="wedding-2.jpg" style="width:100%">     <img src="flower-3.jpg" style="width:100%">     <img src="wedding-3.jpg" style="width:100%">     <img src="flower-4.jpg" style="width:100%">   </div>   <div class="column">     <img src="wedding-cake.jpg" style="width:100%">     <img src="wedding-4.jpg" style="width:100%">     <img src="wedding-5.jpg" style="width:100%">     <img src="flower-5.jpg" style="width:100%">     <img src="flower-6.jpg" style="width:100%">     <img src="wedding-6.jpg" style="width:100%">   </div> </div> </body>

Flexbox Layout website kiểu mẫu

Sử dụng bố cục trang Flexbox trong CSS

<!DOCTYPE html> <html> <head> <title>Page Title</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> * {   box-sizing: border-box; } /* Style the body */ body {   font-family: Arial;   padding: 10px;   background: #e9d8f4;   margin: 0; } /* Header/logo Title */ .header {   padding: 10px;   text-align: center;   background: white;   color: #58257b; } .header h1 {   font-size: 40px; } .header p {   font-size: 20px; } /* Định dạng navigation bar */ .navbar {   display: flex;   background-color: #58257b; } /* Định dạng link điều hướng */ .navbar a {   color: #f2f2f2;   padding: 14px 20px;   text-decoration: none;   text-align: center; } /* Thay đổi màu liên kết khi di chuột qua */ .navbar a:hover {   background-color: #db7093;   color: white; } /* Column container */ .row {   display: flex;   flex-wrap: wrap; } /* Tạo hai cột không bằng nhau nằm cạnh nhau */ /* Sidebar/Cột trái */ .side {   flex: 30%;   background-color: #f1f1f1;   padding: 20px; } /* Cột chính */ .main {   flex: 70%;   background-color: white;   padding: 20px; } /* Hình ảnh tượng trưng */ .fakeimg {   background-color: #baa1cc;   width: 100%;   padding: 20px; } /* Footer */ .footer {   padding: 10px;   text-align: center;   background: white;   margin-top: 10px; } /* Bố cục linh hoạt: các cột xếp chồng lên nhau thay vì cạnh nhau khi màn hình  có chiều rộng dưới 600px */ @media screen and (max-width: 600px) {   .row, .navbar {     flex-direction: column; } } </style> </head> <body> <!-- Header --> <div class="header">   <h1>Website Quản Trị Mạng</h1>   <p>Kiến thức - Kinh nghiệm - Hỏi đáp</p>   <p>Sử dụng <b>flexible</b> layout.</p> </div> <!-- Navigation Bar --> <div class="navbar">   <a href="#">Làng Công nghệ</a>   <a href="#">Công nghệ</a>   <a href="#">Khoa học</a>   <a href="#">Cuộc sống</a> </div> <!-- Nội dung --> <div class="row">   <div class="side">     <h2>Giới thiệu</h2>     <div class="fakeimg" style="height:200px;">Ảnh</div>     <p>Quantrimang.com là mạng xã hội về khoa học công nghệ.</p>     <h3>Nổi bật</h3>       <div class="fakeimg" style="height:60px;">Ảnh</div><br>       <div class="fakeimg" style="height:60px;">Ảnh</div><br>    <div class="fakeimg" style="height:60px;">Ảnh</div>     <h3>Follow Me</h3>     <p>Facebook</p>     <p>YouTube</p>   </div>   <div class="main">     <h2>Form - Biểu mẫu trong CSS</h2>     <h5>Quách Tỉnh, 14/02/2019</h5>     <div class="fakeimg" style="height:200px;">Ảnh</div>     <p>Form là một phần không thể thiếu trong bất kì loại website nào.</p>  <p>Ở bài viết này, Quantrimang.com sẽ hướng dẫn bạn cách xây dựng phần 
 giao diện hiển thị của một biểu mẫu cơ bản. Giao diện này có thể được làm 
    khá đẹp mắt với CSS</p>     <br>     <h2>Attribute Selector trong CSS</h2>     <h5>Quách Tỉnh, 14/02/2019</h5>     <div class="fakeimg" style="height:200px;">Ảnh</div>  <p>Attribute selector là cách chọn các phần tử bạn muốn định kiểu trong 
    tài liệu HTML dựa vào thuộc tính của một hay nhiều thẻ HTML nào đó.</p>  <p>Attribute selector có thể chọn được các đối tượng mà không cần phải 
 khai báo thêm các Class hoặc ID vào trong thẻ HTML và vẫn có thể hướng 
    được đến các thành phần đó, giúp code gọn gàng hơn và mạch lạc hơn.</p>   </div> </div> <!-- Footer --> <div class="footer">   <h4>Giấy phép số 362/GP-BTTTT. Bộ TT&TT cấp ngày 30/06/2016.</h4> </div> </body> </html>

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

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

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

Hướng dẫn chạy nhiều Node version khác nhau trên Windows

Hướng dẫn chạy nhiều Node version khác nhau trên Windows

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

Tại sao lại có nhu cầu này?

Ví dụ như source code mỗi project yêu cầu một node version khác nhau, và bắt buộc phải đúng version đó mới chịu

  10 Công ty hàng đầu thế giới sử dụng Node.js
  Cách tạo một Docker đơn giản cho Node.JS

Todo bạn cần làm

Gỡ bỏ Node đang sử dụng, và xóa hết các thư mục liên quan C:\Users<user>\AppData\Roaming\npm

Tải về và cài đặt Node Version Manager

Ví dụ bạn cần chạy Node version 10.18.0 và 12.16.1, chạy lệnh sau trọng PowerShell

# installs the node version 10.19.0
nvm install 10.19.0

# installs the node version 12.16.1
nvm install 12.16.1

Để chỉ định version muốn dùng, chạy lệnh

nvm use 12.16.1
// switch về 10.19.0
nvm use 10.19.0

Lưu ý chạy bằng quyền admin nhé.

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

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

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

Khi mình cố gắng code mọi thứ hoàn hảo

Khi mình cố gắng code mọi thứ hoàn hảo

Bài viết được sự cho phép của tác giả Phạm Bình

Chào các bạn,

Con người chúng ta sinh đã luôn thích cái đẹp: người đẹp, tâm hồn đẹp, nhà đẹp, xe đẹp, quần áo đẹp và… Code đẹp – một quan niệm về cái đẹp chỉ có ở các lập trình viên. Mình cũng vậy, mình cũng như các bạn, rất thích cái đẹp, và rất thích code đẹp.

Code thế nào được coi là code đẹp?

Mỗi người lại quan điểm về cái đẹp khác nhau, hơn nữa “code đẹp” lại là một khái niệm chưa có trong từ điển Tiếng Việt, thế nên phần này mình xin trình bày quan điểm của mình thế nào là code đẹp nha:

  1. Code chạy đúng trong mọi trường hợp: Nghĩa là cho dù sản phẩm của bạn có phát triển lớn tới cỡ nào, thì cũng vẫn là đoạn code đấy chạy. Sản phẩm của bạn có 1 người dùng cũng chạy đúng mà 10 triệu người dùng cũng vẫn chạy đúng, vẫn đáp ứng được hiệu năng.
  2. Code chuẩn Style GuideStyle Guide là những quy ước về cú pháp, cách đặt tên biến, tên hàm, tên hằng trong dự án. Code chuẩn style guide là code tuân theo các quy ước này.
  3. Code áp dụng các design pattern phù hợpDesign Pattern hiểu nhanh nó là một mô hình giúp các bạn giải quyết vấn đề, áp dụng design pattern chuẩn sẽ giúp code của bạn trong sáng và dễ hiểu, dễ tái sử dụng.
  4. Code áp dụng các công nghệ tiên tiến nhất: Tất cả những gì tiên tiến nhất sẽ phải hội tụ trong dự án của bạn.
  5. Code không bị dư thừa: Không dư thừa các các hàm không dùng đến, không dư thừa các file, các thư mục không dùng đến.
  6. Code an toàn và bảo mật: Code sao để hacker không thể tấn công được.

Các tiêu chí về code đẹp là do mình tự đặt ra như vậy, có bạn nào đã từng làm dự án nào mà chứa toàn code đẹp như vậy chưa?

  "Mẹo bỏ túi" cho dân coder mới vào nghề
  "Code dễ đọc" là như thế nào?

Code đẹp rất Lợi – Hại

Không thể phủ nhận, code đẹp có rất nhiều mặt lợi. Mình nhớ hồi còn là sinh viên, vì túng tiền nên nhận bảo trì một trang web bán hàng cho một doanh nghiệp nọ. Họ yêu cầu mình thay đổi một số giao diện website kèm phát triển thêm một số tính năng mới, và hứa sẽ thưởng thêm nếu làm tốt công việc. Lúc nhận yêu cầu, mình thấy công việc cũng không có gì khó khăn, nghĩ bụng phen này chắc sắp giàu rồi. Thế nhưng mọi thứ quay ngoắt 180 độ khi mình có trong tay source code của họ… Dự án không hề áp dụng MVC mà viết lẫn lộn cả 3 thành phần vào nhau, tên file và thư mục thì tùy ý đặt tên, code thì không tuân theo style nào cả, mọi thứ cứ lẫn lộn lên như ly chè thập cẩm. Mình chán ngán và hỏi tại sao code lại “thúi” như vậy, thì các anh ở đấy bảo code này được phát triển từ một đề tài của sinh viên từ khá lâu rồi, lại trải qua nhiều lần nâng cấp, mỗi người thêm thắp một tý thành ra source code mới rối rắm đến thế. Nghĩ mà chán, thế nên mình quyết định từ bỏ dự án này, cũng may là bên họ tốt không bắt mình đền bù dự án :'(.

Kể câu chuyện như vậy để bạn thấy rằng tầm quan trọng của việc code đẹp, nếu dự án được được áp dụng mô hình MVC thôi, là quá trình bảo trì đã đơn giản hơn rất nhiều rồi. Nhưng đằng này…

Bên cạnh những mặt lợi không thể chối cãi, thì khi code quá đẹp cũng gây ra một số tác dụng phụ ảnh hưởng xấu tới dự án và chính mình, vì cái gì quá cũng không tốt mà. Bản thân mình đã gặp và cảm nhận được một số ảnh hưởng tiêu cực của việc lúc nào cũng cố gắng code đẹp như sau:

Code nắn nót quá sẽ tốn nhiều thời gian

Quá nắn nót vào từng dòng code khiến mình mất nhiều thời gian để suy nghĩ hơn. Giả sử như nỗi khi muốn đặt tên biến, tên hàm, tên file, tên thư mục… Mình thường suy nghĩ kỹ xem có nên đặt tên như vậy không, nhiều khi lúc này thấy hợp lý rồi, nhưng ngày mai nghĩ lại thì lại thấy cái tên khác hợp lý hơn. Thế là quay ra sửa lại code ngày hôm qua, cứ như vậy tạo nên một vòng luẩn quẩn khiến mình mãi không hoàn thiện nổi một tính năng.

Suy nghĩ đến những trường hợp quá xa

Nghĩ quá xa, vượt quá phạm vi của bài toán khiến mình mãi không ưng với những dòng code mình viết ra. Ví dụ dự án của mình làm xong thì cùng lắm có 5000 người dùng, thế nhưng mình luôn nghĩ phải thiết kế hệ thống sao cho đáp ứng được 5 triệu người dùng. Dự án của mình không cần phải mở rộng, thế nhưng mình luôn code theo hướng có thể mở rộng. Điều này khiến mình tốn rất nhiều thời gian để tìm hiểu, để thay đổi, trong khi các trường hợp đấy không bao giờ xảy ra với dự án mình đang theo đuổi.

Tích hợp nhiều công nghệ mới, trong khi nó chưa phổ biến

Khi PHP vừa mới ra mắt phiên bản 7.0, mình hí hưởng triển khai ngay một dự án cho công ty trên nền tảng mới này. Sau khi làm xong, đến bước deploy thì không deploy nổi bởi vì hosting mà công ty mua chỉ chạy được PHP 5.x. Kết quả là công ty mình đã phải chuyển qua sử dụng VPS, để có thể tự cài PHP 7 lên và chạy.

Một câu chuyện khác nữa, thời mà vuejs nổi lên như một framework js tích hợp những thứ hay ho nhất của angularjs và reactjs. Mình có áp dụng vue vào một dự án outsource, thời gian đầu dự án chỉ có một mình mình làm thì không có đáng nói, chuyện chỉ đáng nói khi mình không làm dự án nữa và bàn giao lại cho team khác. Nhưng vì vue là một framework mới, nên team đó không ai biết gì về vue cả. Vậy là mình phải dành 1 tuần để training cho họ về vue. Thế nhưng cũng vì có dịp training này mà mình có thêm vài người bạn mới, và sau đó cũng nhận thêm được một vài dự án outsource của team đấy gửi về – đúng là cho đi thì sẽ được nhận lại mà.

Quá tập trung vào code mà quên mất mục đích chính của dự án

Có lần mình làm một dự án về rao vặt bất động sản, tính năng chính là cho khách có thể tạo tài khoản và đăng tin rao vặt lên website. Thế nhưng vì quá mải mê vào việc code sao cho đẹp mà mình cứ làm đi làm lại một tính năng phụ, trong khi tính năng chính cần tập trung thì không làm. Kết quả là sắp deadline, mình phải OT để làm cho kịp dự án.

Khi mình cố gắng code mọi thứ hoàn hảo
Cứ tập trung vào các chi tiết phụ, còn chi tiết chính thì lại làm nham nhở :p

Mang dao mổ trâu đi giết gà

Một bài toán đơn giản thì hãy cứ giữ cho nó đơn giản – Mình chỉ ước là nhận ra điều này sớm hơn. Hồi mới đi làm, mình được giao cho một task là liệt kê danh sách các khách hàng dưới dạng bảng và có bộ lọc theo mã khách hàng, tên khách hàng, trạng thái,… Tính năng này không hề khó, thế nhưng vì muốn sản phẩm nhìn phải thật ngầu, thật đẹp nên mình đã tích hợp thư viện datatable để hiển thị danh sách này. Cứ nghĩ phen này chắc là được khen tấm tắc, nào ngờ phải đập đi làm lại vì lý do “mang dao mổ trâu đi giết gà”. Việc sử dụng datatable để hiển thị giao diện bảng nhìn thì đẹp thật nhưng nó không cần thiết trong trường hợp này, hơn nữa việc tích hợp thư viện bên thứ ba như vậy sẽ làm dự án khó bảo trì hơn.

Một câu chuyện khác nữa, mình có web có tính năng rút gọn link. Phiên bản đầu dự án được build bằng PHP thuần với html, css tự viết. Sau đó mình nghe nói đến framework Laravel tuyệt lắm, thế là mình sử dụng Laravel để làm backend thay cho PHP thuần trước đó. Tiếp đến, mình lại nghe nói đến Single Page App đem lại trải nghiệm mượt mà, thế là mình lại mày mò áp dụng Single Page App cho dự án này. Kết quả là sản phẩm có tốt hơn, nhưng không tốt hơn là mấy, trong khi mình lại tốn quá nhiều thời gian cho việc thay đổi này. Nếu như bỏ qua việc mình học được thêm 2 công nghệ mới ra, thì việc đánh đổi như vậy là không xứng đáng. Nhưng cũng may, đây chỉ là dự án cá nhân của mình, nên không ảnh hưởng tới ai cả.

Lời kết

Các cụ nói cấm có sai “cái gì cũng có hai mặt”, tốt quá cũng xấu, mà xấu quá thì… chắc chắn là xấu rồi. Qua bài viết này, mình muốn nhắn nhủ một vài điều như sau

  • Thứ nhất: Code đẹp, nhưng phải đẹp trong phạm vi của bài toán. Sản phẩm có 1 trăm người dùng, khác hoàn toàn với sản phẩm có 1 triệu người dùng, mặc dù hai sản phẩm có thể cùng tính năng.
  • Thứ hai: Code đừng quá thông minh, bởi không phải ai cũng đủ thông minh để có thể hiểu được những dòng code thông minh đó.
  • Thứ ba: Đôi khi phải đánh đổi sự tốt nhất, nhanh nhất bằng sự phổ biến nhất.
  • Thứ tư: Cân nhắc công sức bỏ ra để đánh đổi lấy code đẹp. Nếu có hai lựa chọn “Code đẹp 8 mất 1 giờ” và “Code đẹp 10 mất 100 giờ” thì hãy chọn Code đẹp 8.
  • Thứ năm: Những tính năng đã hoàn thiện thì hãy cứ để nó ở quá khứ, nếu muốn cải thiện thì phải có kế hoạch rõ ràng.
  • Thứ 6: Code đẹp chưa chắc tạo ra sản phẩm tốt, sản phẩm tốt chưa chắc đã là code đẹp

Bài viết trên là các kinh nghiệm mình rút ra được trong quá trình làm việc. Hy vọng sẽ giúp ích cho ai đó…

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

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

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

8 cách để học “dốt” lập trình

8 cách để học “dốt” lập trình

Bài viết được sự cho phép của tác giả Phạm Bình

Chào các bạn,

Hiện tại thì có rất nhiều các blog lập trình viết về việc làm sao để học lập trình tốt rồi, các phương pháp thì cũng hay và bổ ích. Nhưng hôm nay mình sẽ viết ngược lại, mình sẽ chỉ cho các bạn một số cách để học “dốt” lập trình, đảm bảo là bạn sẽ “dốt” mãi, “dốt” không ngóc lên được.

CÁCH 1: DÀNH CÀNG ÍT THỜI GIAN CÀNG TỐT

Cần cù thì bù siêng năng,… à nhầm bù thông minh. Nếu như bạn dành thời gian khoảng 30 phút mỗi ngày cho việc rèn luyện kỹ năng lập trình thì bạn sẽ không dốt được đâu. Thay vào đó bạn nên dành nhiều thời gian cho việc chơi game, lướt facebook vô bổ, xem phim, hoặc đi nhậu với bạn bè thì hơn. Trong trường hợp mà bạn không có việc gì để làm cả, thì mình khuyên bạn nên đi ngủ cho khỏe.

Bạn cũng phải lưu ý là đừng lên các diễn đàn, group facebook về lập trình, đừng subscribe các chanel youtube hay thường xuyên đọc blog về lập trình làm gì cả. Bởi như vậy bạn sẽ rất dễ dàng có kiến thức – không thể nào mà dốt nổi.

CÁCH 2: HÃY COI THƯỜNG CÁC KIẾN THỨC CƠ BẢN

Kiến thức cơ bản về lập trình như một số giải thuật tìm kiếm, giải thuật sắp xếp, cấu trúc dữ liệu, lập trình hướng đối tượng thì bạn đừng có học. Bởi đây đều là những kiến thức nền tảng giúp bạn trở thành một lập trình viên giỏi sau này.

Nếu có ai đó nói với bạn nên học thật chắc các kiến thức nền tảng này trước khi học các kiến thức cao siêu khác thì đừng nghe, tuyệt đối đừng nghe. Vì họ chỉ đang muốn bạn giỏi lập trình hơn thôi.

CÁCH 3: ĐỪNG NGHE LỜI KHUYÊN CỦA CÁC BẬC TIỀN BỐI

Lời khuyên mà mình nhắc tới ở đây là lời khuyên về cách phương pháp học lập trình hiệu quả.

Các bậc tiền bối (thầy cô, anh chị, bạn bè đi trước) là những người đã có kinh nghiệm thực tế, họ từng trải và thường biết cách làm sao để học tốt lập trình. Nếu như họ cho bạn lời khuyên chân thành thì… cứ làm ngược lại, hoặc ít nhất thì nên bỏ ngoài tai thì đảm bảo bạn sẽ không thể tiến bộ hơn trong lập trình.

CÁCH 4: HỌC LÝ THUYẾT LÀ QUÁ ĐỦ

Học thì phải đi đôi với hành, vì thế bạn đừng bao giờ thực hành cả. Việc thực hành làm các dự án nhỏ, làm các bài tập lớn sẽ khiến bạn củng cố kiến thức lập trình, khiến bạn giỏi lên khá nhanh. Vì thế đừng có thực hành, lý thuyết là quá đủ rồi, hoặc thậm chí bạn cũng chẳng cần học lý thuyết luôn nếu muốn trở thành người “dốt” nhất.

Mình thường có thói quen làm các dự án nho nhỏ để củng cố hoặc học thêm kiến thức mới, bạn tuyệt đối không nên học theo.

  10 câu nói cực hay về lập trình
  10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết

CÁCH 5: CÁC KHÓA HỌC MIỄN PHÍ ĐẦY TRÊN MẠNG, ĐỪNG BAO GIỜ TÌM KIẾM CHÚNG

Ngày nay quá dễ dàng để tìm thấy các khóa học lập trình miễn phí nhưng chất lượng trên mạng. Các từ khóa như học lập trình cơ bản, khóa học lập trình miễn phí là các từ khóa bạn nên tránh xa khi tìm kiếm nếu không muốn bị giỏi lên.

CÁCH 6: ĐỪNG CHỦ ĐỘNG

Nếu bạn có đang học mà gặp phải một vấn đề khó khăn thì đừng vội suy nghĩ làm gì cho mệt người, tìm ngay thằng bạn thân bênh cạnh mà hỏi. Hoặc được giao làm bài tập lớn để tuần sau báo cáo, thì cứ chơi đi, sát ngày báo cáo thì lên mạng tìm xem có bài nào tương tự thì mang về chỉnh sửa là được.

Nói tóm lại là bạn không nên chủ động tìm hiểu, không nên suy nghĩ trước khi hỏi.

CÁCH 7: ĐỪNG HỌC TIẾNG ANH

Có một điều bạn nên chú ý đó là các công nghệ mới thì đều bắt nguồn chủ yếu từ “trời Tây”. Vì vậy mà tài liệu công nghệ chuẩn và chính xác nhất thường được viết bằng Tiếng Anh. Bạn chỉ nên tìm hiểu các tài liệu được viết bằng Tiếng Việt, vì đa phần các công nghệ đó đều cũ hoặc không còn gì mới mẻ nữa, thậm chí còn không được sử dụng trong các dự án ngày nay.

Ngoài ra, nếu học tốt Tiếng Anh, bạn sẽ có nguy cơ bị tiếp xúc với một nguồn tài liệu vô cùng phong phú và đa dạng. Cái mà sẽ khiến bạn có thêm nhiều kiến thức, nhiều góc nhìn mà khiến bạn không thể nào dốt lập trình được.

CÁCH 8: ĐỪNG BAO GIỜ ĐAM MÊ

Sau cùng đây là yếu tố quan trọng nhất, bởi nếu đam mê thì trước sau gì bạn cũng sẽ giỏi lập trình à. Vậy nên hãy ghi nhớ “Muốn dốt lập trình, tuyệt đối không đam mê nó”.

Nếu như có bắt buộc phải học lập trình, thì cũng chỉ nên học dạng chống đối, như việc cố học để qua môn, hoặc nhờ người khác giải bài tập hộ chẳng hạn.

CUỐI CÙNG – KẾT LUẬN

Trên là một số điều mà mình cho rằng là cốt lõi nhất nếu bạn muốn học “dốt” lập trình. Vậy làm sao để học TỐT lập trình đây? Đơn giản thôi, cứ làm ngược lại những điều mình nói ở trên là được, hoặc ít nhất cũng tránh những điều đó ra.

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

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

Xem thêm Việc làm IT hấp dẫn tại TopDev

Tip cải thiện UI

Tip cải thiện UI

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

Trong bài trước, mình đã bình luận tại sao chúng ta — những lập trình viên — nên bỏ thời gian để tìm hiểu về UI/UX. Hôm nay, mình xin chia sẻ một vài tip nhỏ để nhanh chóng cải thiện UI.

Nếu bạn muốn xem lại các lý do, hãy đọc bài này.

Những tip dưới đây mình lượm nhặt được dựa trên các bài viết của Marc Andrew. Đó là những điều không quá “vĩ mô” nhưng sẽ cải thiện nhiều cho thiết kế app của bạn.

Tip cải thiện UI

1. Làm cho các thành phần tách biệt với nhau hơn

Các thành phần có thể tách biệt với nhau hơn bằng cách dùng đường viền (border) rất mảnh, đậm màu hơn một chút so với phần bóng đổ (shadow) của đối tượng.

2. Chỉ dùng một typeface

Có thể bạn đã nghe nhiều về lời khuyên dùng ít nhất 2 typeface. Tuy nhiên, bạn có thể đạt kết quả tốt nếu kết hợp những màu sắc, kích cỡ (font size), độ dày (font weight) khác nhau của cùng môt typeface. Trong khi đó, việc dùng một typeface duy nhất giúp cho thiết kế của phần mềm trở nên nhất quán hơn.

3. Dùng cỡ chữ 20pt cho bài viết dài

Với bài viết dài dằng dặc toàn chữ là chữ, việc dùng cỡ chữ 20pt sẽ giúp người dùng có trải nghiệm đọc tốt hơn. Tất nhiên, việc chọn cỡ chữ sẽ còn phụ thuộc vào việc bạn đang dùng typeface nào.

  18 designer hàng đầu dự đoán về xu hướng UI/ UX trong năm 2022
  5 ví dụ chứng minh dân coder là những anh chàng vui tính nhất thế giới

4. Hạn chế dùng căn giữa

Cố gắng chỉ dùng căn giữa cho tiêu đề hoặc một đoạn văn bản ngắn. Trong hầu hết các trường hợp, việc căn lề trái sẽ cho trải nghiệm đọc tốt hơn.

Tip cải thiện UI

5. Khoảng trắng

Việc dùng khoảng trắng trong thiết kế có lẽ đã không còn là một lời khuyên xa lạ. Đây có lẽ là cách nhanh nhất và đơn giản nhất để cải thiện UI của bạn.

6. Làm nhạt văn bản ở font chữ đậm

Nếu bạn có một bài viết dài và các chữ cái trông có vẻ hơi đậm (font weight lớn) thì việc đọc nó sẽ đôi chút khó chịu, thậm chí gây mỏi mắt. Điều này có thể được cải thiện bằng cách làm nhạt bớt màu của văn bản. Chẳng hạn, thay vì dùng màu đen, hãy chuyển sang dùng các sắc thái khác nhau của màu xám (dark grey), như #4F4F4F.

7. Cỡ chữ càng nhỏ, line height càng lớn

Cũng vì để tăng tính dễ đọc, mỗi khi bạn giảm cỡ chữ (font size) của văn bản, bạn nên tăng line height lên tương xứng, và ngược lại.

Tip cải thiện UI

9. Các sắc thái khác nhau của cùng một màu

Tương tự như mục 2 đã nói về việc dùng một typeface, đôi khi, bạn không nhất thiết phải dùng nhiều màu. Nếu có thể, hãy giảm thiểu số màu trong bảng màu của bạn. Bằng cách nào? Hãy chọn lấy một màu cơ bản (base color) rồi chọn thêm các sắc thái khác nhau (tint và shade) cũng của màu đó. Đây có lẽ là một trong những cách dễ nhất để thiết kế trở nên nhất quán hơn.

10. Làm cho những đối tượng quan trọng trở nên nổi bật

Bạn hoàn toàn có thể làm điều này bằng cách kết hợp cỡ chữ (font size), độ dày (font weight) và màu sắc. Hãy so sánh hai hình dưới đây.

Tip cải thiện UI

11. Đảm bảo “Call to Action” là đối tượng nổi bật nhất

Điều này quá dễ hiểu phải không? Ai cũng sẽ làm điều như một thói quen.

Chưa chắc đâu. Bạn hãy nhìn lại hai hình ở mục 10. Có khi nào, bắt tay vào làm, bạn sẽ để nút mua là một nút “mờ nhạt” không đáng chú ý như hình bên phải? Và bạn có nghĩ là thay vì chỉ có một icon giỏ hàng, nếu thêm từ “Mua ngay” thì sẽ kích thích người dùng nhấn vào không?

12. Báo lỗi rõ ràng

Người dùng quên nhập một trường bắt buộc trong form? Người dùng nhập sai định dạng của trường? Lúc ấy, bạn không nên chỉ nói một câu kiểu như “Đã có lỗi xảy ra”. Việc đơn thuần khoanh đỏ trường bị lỗi cũng là chưa đủ. Bạn hãy đưa ra một chỉ dẫn cụ thể hơn. Người dùng sẽ muốn biết họ sai gì và làm sao để sửa nó.

13. Làm nổi bật những tính năng hay dùng

Nếu bạn có một menu, trong đó hành động “Tải ảnh lên” chẳng hạn, được dùng nhiều nhất, bạn nên làm cho hành động ấy nổi bật hơn các hành động còn lại.


Mong những tip vừa rồi sẽ giúp ích cho bạn. Hãy tiếp tục theo dõi các bài viết khác của mình nhé!

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

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

Xem thêm Việc làm IT hấp dẫn tại TopDev

4 lý do chứng minh “Học lập trình thì tự học là chủ yếu”

4 lý do chứng minh “Học lập trình thì tự học là chủ yếu”

Bài viết được sự cho phép của tác giả Phạm Bình

Chào các bạn,

Lập trình đang là ngành nghề hot hiện nay. Đua theo xu hướng này, là các trung tâm đào tạo lập trình ngày càng nhiều, các trường Đại Học cũng thi nhau bổ sung thêm các ngành, khoa liên quan tới CNTT. Việc có nhiều đơn vị đào tạo như vậy là rất tốt, các bạn muốn theo ngành IT sẽ có nhiều cơ hội học tập hơn. Nhưng các bạn cũng đừng quên rằng “Học lập trình thì tự học là chủ yếu”, đừng ỷ lại vào các trung tâm đào tạo, hay trường học, đừng gán cho họ cái trách nhiệm “phải biến bạn thành lập trình viên”.

Cũng như mình vừa viết “Học lập trình thì tự học là chủ yếu”, và dưới đây là 4 lý do để chứng minh điều này.

Lưu ý: Tự học không có nghĩa là không được học từ người khác, tự học nghĩa bạn phải chủ động tìm hiểu kiến thức, không đợi người khác phải dục, phải bắt ép, hay phải hướng dẫn một cách quá chi tiết như “cầm tay chỉ việc”.

Kiến thức lập trình rất rộng, bạn không thể đợi người khác dạy thì mới học

Tuy lập trình chỉ là một góc của Công nghệ thông tin, nhưng nó cũng đủ rộng để bạn “học mãi mà không hết”. Thực tế, cái “góc nhỏ” lập trình rộng tới nỗi không ai có thể biết hết được. Và mặc dù không ai có nhu cầu học hết mọi thứ, nhưng người ta vẫn luôn có xu hướng học thêm những kiến thức mới.

Mình đã theo đuổi nghề lập trình khá lâu rồi, mình chưa bao giờ đặt mục tiêu là phải học tất tần tật kiến thức lập trình. Nhưng mình vẫn phải nạp thêm kiến thức mới vì nó thật sự có ích cho công việc.

Điều đó cho thấy rằng dù không ai đặt mục tiêu là học hết, chỉ cần học một phần nhỏ để đáp ứng được công việc, nhưng như vậy thôi cũng đủ để người ta “học mãi mà không hết”.

Như vậy, nếu bạn cứ đợi ai đó dạy thì mới học, thì sớm muộn những kiến thức bạn có cũng sẽ bị lỗi thời, hoặc là nó quá cơ bản, không giúp bạn đạt được hiệu quả cao trong công việc.

Chi phí để học rất cao, bạn sẽ không đủ tiền và thời gian

Giả sử quan điểm của mình ở mục I không đúng với bạn, tức là bạn đều đặn tham gia một khóa học nào đó để tiếp thu kiến thức mới – đồng nghĩa là luôn có người dạy bạn. Thì mình cho rằng mỗi tháng bạn sẽ phải tham một khóa học khác nhau, với học phí giao động từ 1 – 10 triệu, và tiêu tốn khoảng 16 – 24 giờ học. Các kiến thức càng mới, càng khó thì học phí càng cao và thời gian học cũng càng nhiều. Liệu bạn có đủ tài chính và thời gian để “học lập trình” theo cách này.

  2 nhận định sai lầm về việc bắt đầu học lập trình

Kiến thức khó thì không có ai dạy

Khi đi làm, biết các kiến thức căn bản có thể giúp bạn hoàn thành được 80% công việc, nhưng đó chỉ là các công việc đơn giản kiểu “ai cũng làm được nếu họ chịu làm”. 20% công việc còn lại, dù ít, nhưng nó lại là các công việc quan trọng, có độ khó nhất định, có tính quyết định đến toàn bộ tính năng của sản phẩm. Nhưng thật sự rất khó để tìm được nơi dạy bạn giải quyết các vấn đề khó đó.

Các kiến thức lập trình được dạy ở các trung tâm đào tạo, hoặc các trường Đại học đa phần đều là những kiến thức căn bản, hoặc dạng lý thuyết hàn lâm. Những kiến thức chuyên sâu, kiến thức khó thì lại chẳng có ai dạy, hoặc có người dạy nhưng không hiểu:

  • Người dạy giỏi thì thường không giỏi công nghệ: Mỗi người chỉ có 24h, nếu họ tập trung vào kỹ năng dạy, họ sẽ không có thời gian để tìm hiểu công nghệ chuyên sâu.
  • Người biết thì không truyền đạt được: Cũng như ý trên, nếu họ tập trung vào kỹ năng công nghệ, họ sẽ không có thời gian để rèn luyện khả năng trình bày, hoặc đơn giản là họ không có thời gian để truyền đạt cho người khác.
  • Ít người quan tâm tới các vấn đề khó: Mình cũng chỉ ra rồi, chỉ 20% công việc là khó, nên cũng ít người quan tâm. Việc khó đã chẳng ai dạy, đã thế lại còn chẳng ai học, cứ vậy nó tạo nên cái vòng luẩn quẩn.

Vậy nếu bạn muốn học các kiến thức khó, các kiến thức chuyên sâu, cách tốt nhất vẫn là tự học.

Mỗi lập trình viên luôn có “n” vấn đề

Mỗi lập trình viên luôn có các vấn đề của riêng họ, trong khi các trung tâm đào tạo hay trường học mở ra là để dạy cho nhiều người, nên sẽ có nhiều kiến thức buộc bạn phải tự học thì mới biết được, như cách dùng một thư viện (thư viện lập trình) nào đó, hoặc cách dùng một framework mới mẻ, hoặc đơn giản là chữa một lỗi khó hiểu.

Tất cả các vấn đề kể trên đều đòi hỏi đến khả năng tự học, tự tìm hiểu, bởi không có ai giống ai, vấn đề của bạn người khác chưa chắc đã quan tâm, nên khả năng cũng sẽ không có ai giúp bạn.

Bài viết này không có ý nói rằng “học lập trình thì bắt buộc phải tự học”, hay cũng không có ý nói rằng học lập trình tại các trung tâm hay trường Đại học là không hiệu quả. Cách tốt nhất vẫn là học theo cả hai cách này, dù không có một tỷ lệ nào giữa việc được người khác dạy và tự học, nhưng qua trải nghiệm của bản thân, mình có thể khẳng định Học lập trình thì tự học là chủ yếu.

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

Bài viết liên quan

Học lập trình cần học các kiến thức cơ bản nào?

Lập trình viên cần học những gì? Làm thế nào để trở thành một lập trình viên giỏi? Đây là câu hỏi mà những người bắt đầu học lập trình rất quan tâm. Tuy nhiên, đưa ra câu trả lời cho những câu hỏi này lại không hề đơn giản. Lập trình là một lĩnh vực rộng lớn, luôn thay đổi và phát triển liên tục, điều này khiến cho nhiều người mới bắt đầu học lập trình rất mông lung khi bước chân vào thế giới của công nghệ thông tin. Nếu bạn đang gặp phải vấn đề này và chưa biết bắt đầu từ đâu, thì bài viết này sẽ giúp cho bạn. Lập trình viên cần học những gì? Kiến thức về lập trình, chuyên môn kỹ thuật Công nghệ thông tin là một lĩnh vực rất đa dạng và phức tạp, tuy nhiên, để trở thành [...]

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

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

Xem thêm Việc làm IT hấp dẫn tại TopDev

5+ ứng dụng cải thiện hiệu suất công việc và quản trị nhân sự

quản trị nhân sự

Nhiều ứng dụng tích hợp công nghệ hỗ trợ rất nhiều trong công tác quản trị nhân sự. TopDev đã tổng hợp 5+ các công cụ hỗ trợ tốt cho việc cải thiện hiệu suất công việc và quản trị nhân sự. Cùng check xem đó là những công cụ nào nhé!

Skype 

Được sở hữu bởi Microsoft, skype chứng tỏ mình là một ứng dụng rất tuyệt vời. Skype giúp cải thiện hiệu suất thông qua giao tiếp bằng thời gian thực. 

  5 lưu ý để viết đánh giá hiệu suất của bạn
  Nguyên tắc 7C - Checklist hoàn hảo cho cuộc giao tiếp hiệu quả

quản trị nhân sự

Với những tính năng thông minh, tương thích trên nhiều nền tảng khác nhau, skype cho phép người dùng tạo ra những cuộc giao tiếp cá nhân hoặc nhóm; kết kết nối qua video hoặc qua tin nhắn.

Ngoài ra, skype còn những tính năng khác trong công tác hỗ trợ nhân sự phát triển: gửi tập tin và chia sẻ màn hình. Thậm chí bạn có thể gọi được cả những số điện thoại không thuộc skype. 

Trello 

Trello được biết đến là một ứng dụng quản lý dự án. Đồng thời, nó còn hỗ trợ thực hiện các công việc, giúp thiết lập và phân bổ các task theo hệ thống thẻ. Giao diện trực quan là một điểm nhấn đặc biệt của Trello. Khi có thể khiến người dùng nắm bắt một cách tổng quát nhanh chóng quá trình thực hiện dự án. 

Xem thêm: Recruitment Marketing – Khám phá 4 ý tưởng sáng tạo nội dung

quản trị nhân sự

Nếu muốn xem và đánh giá tình hình, bạn chỉ cần click vào để mở thẻ đó. Không những thế, Trello còn có tính năng thông báo đến các thành viên nhóm bằng cách gửi email cho họ. Điều này giải quyết được những thay đổi phát sinh trong suốt quá trình.

Evernote

Evernote giúp bạn tối ưu hóa các danh mục ghi chú những mục quan trọng. Ngoài ra, nó còn giúp lưu trữ hình ảnh theo hệ thống quản lý thông minh.

quản trị nhân sự

Điểm nổi trội của Evernote nằm ở chỗ nó là công cụ tìm kiếm mạnh mẽ. Những tìm kiếm của bạn sẽ được ghi nhận và lưu lại. Do vậy, không bao giờ bạn bị mất đi các ghi chú quan trọng. Trello còn chia sẻ các ghi chú cho các thành viên hoặc đồng nghiệp cùng một nhóm. Đồng thời, cho phép bạn cài đặt nhắc nhở và thông báo, tránh tình trạng trễ deadline.

Dropbox 

Xuất hiện không lâu nhưng tầm ảnh hưởng của dropbox không thể đùa được. Sứ mệnh của công cụ này chính là quản trị hiệu suất. Hơn thế nữa, dropbox còn giúp bạn lưu trữ các tập tin quan trọng. Nguồn dữ liệu sẽ được đảm bảo nếu bạn sử dụng dropbox.

Xem thêm: Làm việc từ xa (remote) – Chính sách nhân sự mới của doanh nghiệp 

quản trị nhân sự

Dropbox là dịch vụ lưu trữ đám mây. Do đó, bạn có thể truy cập các tập tin của bạn từ các thiết bị bất kỳ có kết nối internet. Dropbox còn giải quyết được vấn đề về không gian khi các thành viên nhóm làm việc từ xa. Hơn nữa, hiện tại ứng dụng này cũng đề cao tính hiệu quả tương tác cộng đồng do tính răng cho phép bình luận.

IFTTT

IFTTT là một ứng dụng giúp cải thiện hiệu suất khá hiệu quả. Nó sử dụng các trường hợp “If (nếu điều này xảy ra); Then (thì sau đó)” để tự động hóa các quy trình chung và tổ chức hợp lý hóa luồng công việc của bạn. 

quản trị nhân sự

Bạn có thể bắt đầu bằng cách xác định điều kiện “If” , được gọi là điều kiện kích hoạt (trigger). Tiếp theo, bạn xác định “Then”, là hành động mà bạn muốn thực hiện. Lưu ý là điều kiện kích hoạt của quá trình đó phải giống nhau. Sự kết hợp tác vụ có điều kiện kích hoạt này được gọi là “Recipes (Công thức)” 

Vì IFTTT tương thích với rất nhiều các ứng dụng phổ biến, bạn có thể cài đặt các Recipes để thực hiện rất nhiều tác vụ thường lệ một cách tự động.

Hootsuite 

Hootsuite được sử dụng để quản lý các công việc truyền thông xã hội một cách hiệu quả. Nó hỗ trợ việc xây dựng thời gian biểu cho các bài post truyền thông trên các nền tảng xã hội. Hơn nữa, Hootsuite còn đưa ra những phân tích truyền thông cho người dùng nắm bắt thông tin. 

quản trị nhân sự

Bên cạnh đó, Hootsuite còn theo dõi các luồng truyền thông xã hội khác nhau tại cùng một thời điểm. Điều này thật tuyệt vời nếu bạn muốn xem sự tham gia của phương tiện truyền thông xã hội trong tích tắc mà không tốn quá nhiều thời gian.

Lời kết

Mỗi ứng dụng đều có những ảnh hưởng tích cực đến việc cải thiện hiệu suất trong công tác quản trị nhân sự. Và tất nhiên, tùy vào từng loại ứng dụng và chúng ta quyết định sử dụng nó trên các thiết bị khác nhau. Mấu chốt để tiết kiệm thời gian đó là sử dụng các ứng dụng cải thiện hiệu suất trong luồng công việc thường ngày của bạn thường xuyên. TopDev hy vọng rằng bạn sẽ tìm ra đâu là ứng dụng yêu thích của bạn và xác định cách sử dụng chúng một cách hiệu quả nhất?


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

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

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

11 tip học Python dành cho các “newbie”

11 tip học Python dành cho các “newbie”

Đâu là cách thức tốt nhất để học Python? Đây có lẽ là một trong những câu hỏi phổ biến nhất mà các “newbie” chân ướt chân ráo bước vào thế giới của Python thắc mắc và tìm hiểu.

Chúng tôi tin rằng bước đầu tiên trong việc học bất kỳ ngôn ngữ lập trình nào là đảm bảo rằng bạn hiểu cách học vì đây được cho là kỹ năng quan trọng nhất liên quan đến lập trình máy tính.

Tại sao biết cách học quan trọng như vậy? Câu trả lời rất đơn giản: khi ngôn ngữ ngày càng phát triển, các thư viện của ngôn ngữ và các công cụ cũng sẽ được nâng cấp. Biết cách học sẽ rất cần thiết để theo kịp những thay đổi này và trở thành một lập trình viên thành công.

11 tip học Python dành cho các “newbie”

Có thể khẳng định rằng Python là ngôn ngữ rất tuyệt vời. Nếu bạn vừa quyết định sẽ “dấn thân” vào cuộc hành trình với đích đến là trở thành một lập trình viên Python “đẳng cấp” thì đây sẽ là một số chiến lược học tập. Hãy cùng Quantrimang tìm hiểu xem nhé!

Hãy làm cho Python trở nên gắn bó với bạn

Tip #1: Viết code hằng ngày

Sự kiên trì là rất quan trọng khi bạn đang học một ngôn ngữ mới. Tip đầu tiên dành cho bạn là nên kiên trì tập viết code mỗi ngày. Khi bạn lặp đi lặp lại một hành động nào đó, bộ não sẽ dần ghi nhớ. Theo thời gian, bạn sẽ thực hiện ngày càng tốt hơn, nhanh hơn, giỏi hơn. Điều này gọi là “Ký ức cơ bắp”. Việc kiên trì viết code hằng ngày sẽ giúp bạn phát triển “cơ bắp” này đấy! Có thể lúc đầu sẽ làm bạn hơi chán, vì vậy hãy thử bắt đầu với khoảng 25 phút mỗi ngày và tăng dần thời gian.

11 tip học Python dành cho các “newbie”

Ghé thăm hơn 100 bài tập Python có lời giải để bắt đầu làm quen với Python từ những bài tập dễ đến khó nhé.

Tip #2: Mạnh dạn viết code ra

Khi đã có những tiến bộ trên hành trình trở thành một lập trình viên, bạn sẽ tự hỏi liệu mình có cần viết code, viết note lại những gì cần lưu ý không? Câu trả lời là có, chắc chắn rồi! Trong thực tế, các nghiên cứu cho thấy rằng viết note bằng tay là có lợi nhất cho việc ghi nhớ và duy trì lâu dài công việc. Điều này sẽ đặc biệt có lợi cho những người làm việc hướng tới mục tiêu trở thành các nhà phát triển/lập trình viên full-time, vì nhiều cuộc phỏng vấn sẽ liên quan đến việc viết code trên bảng trắng.

Khi bạn bắt đầu làm việc trên các dự án và chương trình nhỏ, viết bằng tay có thể giúp bạn lập kế hoạch cho code trước khi bạn chuyển sang viết trên máy tính. Bạn có thể tiết kiệm rất nhiều thời gian nếu viết ra những hàm và lớp nào cần, cũng như cách chúng sẽ tương tác.

  Date & Time trong Python

Tip #3: Code trực tiếp trên cửa sổ dòng lệnh của Python

Cho dù bạn đang bắt đầu tìm hiểu về cấu trúc dữ liệu cơ bản của Python hay bạn đã thông thạo để gỡ lỗi một ứng dụng thì cửa sổ dòng lệnh của Python – Python shell luôn là một trong những công cụ học tập tốt nhất của bạn.

11 tip học Python dành cho các “newbie”

Để sử dụng Python shell (đôi khi còn được gọi là Python REPL) thì trước tiên hãy đảm bảo rằng Python đã được cài đặt trên máy tính của bạn. Để kích hoạt cửa sổ dòng lệnh Python shell, chỉ cần mở terminal và chạy python hoặc python3 tùy thuộc vào cài đặt.

Tip #4: Có thời gian nghỉ giải lao hợp lý

Nghỉ giải lao là rất quan trọng để có một buổi học và làm việc hiệu quả, đặc biệt là khi bạn đang tiếp nhận nhiều thông tin mới. Khi phải đối mặt với một quy trình, bạn nên chia ra thành các nhiệm vụ nhỏ để làm trong một khoảng thời gian ngắn, xen giữa các khoảng làm việc ngắn sẽ là những khoảng break-time. Phương pháp này sẽ huấn luyện bộ não của bạn tập trung làm việc trong một thời gian ngắn, giúp bạn rơi vào tình thế luôn có những hạn chót để hoàn thành công việc và cũng thường xuyên được nạp lại năng lượng.

11 tip học Python dành cho các “newbie”

Những khoảng break-time này đặc biệt quan trọng khi bạn đang gỡ lỗi. Nếu bạn gặp phải một lỗi và không thể hiểu được nó nằm ở đâu, hãy nghỉ ngơi một lúc xem nhé. Bước ra khỏi máy tính của bạn, đi dạo hoặc trò chuyện với ai đó.

Trong lập trình, code của bạn luôn phải tuân theo chính xác các quy tắc và logic của ngôn ngữ, do đó có thể chỉ thiếu một dấu ngoặc kép thôi cũng có thể phá vỡ mọi thứ. Hãy luôn giữ đôi mắt mình thật sáng và tinh tường.

Tip #5: Trở thành Bug Bounty Hunter

Nói về vấn đề “nai lưng” sửa lỗi thì đây là việc không thể tránh khỏi khi bạn đã bắt đầu viết các chương trình phức tạp hơn. Ai cũng sẽ gặp phải tình trạng này thôi, đừng quá lo lắng nhé! Quan trọng, đừng để những lỗi này “hạ gục” và làm bạn thất vọng. Thay vào đó, khi tìm và sửa thành công “cái thứ khó ưa” ấy, bạn hãy tận hưởng khoảnh khắc và nghĩ về bản thân như một Bug Bounty Hunter – thợ săn tiền thưởng lỗi.

Khi gỡ lỗi, điều quan trọng là phải có một phương pháp phương pháp để giúp bạn tìm ra nơi đang bị lỗi phá hỏng. Xem qua code của bạn theo thứ tự thực thi và đảm bảo mỗi phần đều hoạt động là một cách khá ổn đấy.

Khi bạn có tìm được khu vực xuất hiện lỗi, chèn dòng mã sau vào tập lệnh của bạn và chạy nó:

import pdb; pdb.set_trace()

Đây là trình gỡ lỗi Python và sẽ đưa bạn vào chế độ interactive. Trình gỡ lỗi cũng có thể được chạy từ dòng lệnh:

python -m pdb <my_file.py>.
  11 tip học Python dành cho các “newbie”
Phần 3 : Phân chia module”]

Cộng tác với người khác

Khi mọi thứ bắt đầu gắn bó, hãy tiến hành việc học của bạn thông qua sự hợp tác. Dưới đây là một số chiến lược để giúp bạn tận dụng tối đa công việc khi làm với người khác.

Tip #6: Học chung với những người cũng đang tìm tòi như bạn

Mặc dù việc code nghe có vẻ như là một hoạt động đơn độc, nhưng nó thực sự hoạt động tốt nhất khi có nhiều người làm việc cùng nhau. Đây là một tip rất quan trọng, bạn nên học viết mã Python cùng với những người khác có chung mục đích như mình. Điều này sẽ cho phép bạn chia sẻ và học tập thêm các mẹo hoặc thủ thuật hay ho.

11 tip học Python dành cho các “newbie”

Đừng lo lắng nếu bạn không biết nên học cùng ai. Có rất nhiều cách để gặp gỡ những người đam mê học Python! Ở Việt Nam thì chưa nhiều các sự kiện kết nối người học Python nhưng các diễn đàn thì vẫn có kha khá anh tài sẵn sàng giúp đỡ bạn. Nếu bạn đọc hiểu tốt Tiếng Anh thì hãy tham gia PythonistaCafe – một cộng đồng học tập ngang hàng cho những người đam mê Python như bạn!

Tip #7: Dạy Python cho người khác

Người ta nói rằng để học cái gì một cách tốt nhất, đầu tiên bạn nên tìm hiểu sâu về nó và dạy lại kiến thức cho người khác. Có nhiều cách để làm điều này: trình bày hoặc giảng lại với những người yêu thích và có nhu cầu học Python giống như bạn, viết bài đăng trên blog giải thích các khái niệm mới học, ghi lại video giải thích điều gì đó bạn đã tìm hiểu. Mỗi phương pháp này sẽ giúp củng cố sự kiến thức cũng như có thể phơi bày lỗ hổng trong sự hiểu biết giúp bạn nhanh chóng bổ sung kiến thức.

11 tip học Python dành cho các “newbie”

Tip #8: Áp dụng phương pháp Lập trình đôi – Pair Programming

Pair Programming là một phương pháp lập trình gồm 2 lập trình viên, chia sẻ với nhau một không gian làm việc chung (chuột, bàn phím, màn hình, nội dung công việc…) Người sử dụng bàn phím được gọi là “driver”, người còn lại cũng làm việc lập trình tuy nhiên quan tâm đến việc điều hướng hơn, người này được gọi là “navigator”. Vai trò của 2 người này sẽ được hoán đổi liên tục cho nhau sau một khoảng thời gian nhất định (thường khoảng 30 phút ~ 1 giờ). Cả 2 người phải trao đổi với nhau ở mức độ cao nhất, để hướng tới việc giải quyết công việc một cách hiệu quả, chất lượng cao, hạn chế sai sót cá nhân.

11 tip học Python dành cho các “newbie”

Pair Programming có nhiều lợi ích: nó mang đến cho bạn cơ hội không chỉ có ai đó xem lại code giúp bạn mà còn có thể lắng nghe, tham khảo ý kiến của người khác về cùng một vấn đề. Được tiếp xúc với nhiều ý tưởng và cách suy nghĩ sẽ giúp bạn giải quyết vấn đề tốt hơn khi quay lại tự mình viết code.

Tip #9: Đặt những câu hỏi hợp lý và cần thiết nếu cần sự giúp đỡ của người khác

Mọi người luôn nói rằng khi học hỏi thì không có gì gọi là một câu hỏi tồi, nhưng đối với lập trình, bạn rất có thể sẽ đặt một câu hỏi không tốt gây sự không thoải mái cho người giải đáp nếu không chuẩn bị kỹ càng. Khi bạn đang mong muốn có sự giúp đỡ từ một người chưa nắm rõ vấn đề mình đang gặp phải, tốt nhất bạn nên đặt câu hỏi rõ ràng để hiệu suất và chất lượng cao hơn.

  • Đưa ra tổng quan về những gì bạn đang cố gắng làm, mô tả rõ ràng vấn đề gặp phải.
  • Phác thảo những điều bạn đã cố gắng khắc phục.
  • Đưa ra dự đoán của bạn về vấn đề. Điều này để người đang giúp bạn biết bạn đang nghĩ gì và hiểu rằng bạn đã tự mình thực hiện một số suy nghĩ.
  • Demo những gì đang xảy ra. Bao gồm code, thông báo lỗi và giải thích về các bước bạn đã thực hiện dẫn đến lỗi. Bằng cách này, người giúp đỡ không phải cố gắng tạo lại vấn đề.

Câu hỏi phù hợp và vừa phải có thể tiết kiệm rất nhiều thời gian. Bỏ qua bất kỳ bước nào trong số này có thể dẫn đến cuộc trò chuyện qua lại dễ gây ra xung đột. Là một người mới, bạn nên chắc chắn rằng mình sẽ hỏi những câu hỏi hợp lý để truyền đạt suy nghĩ của mình, và để những người giúp đỡ bạn sẽ vui lòng tiếp tục giúp đỡ bạn ở những lần sau.

Tự mình xây dựng chương trình

Tip #10: Thực hành, thực hành, thực hành

Đối với người mới bắt đầu, thực hành nhiều bài tập nhỏ sẽ giúp bạn tự tin với Python, cũng như phát triển bộ nhớ cơ bắp mà chúng ta đã nói ở trên. Khi bạn đã nắm vững các cấu trúc dữ liệu cơ bản (string, list, dictionary, set)lập trình hướng đối tượng thì đó là lúc bạn đã sẵn sàng để bắt đầu tự build chương trình.

11 tip học Python dành cho các “newbie”

Những gì bạn xây dựng không quan trọng bằng cách bạn xây dựng nó. Hành trình tự mình xây dựng sẽ chỉ dạy cho bạn nhiều nhất. Bạn cũng có thể học được rất nhiều từ việc đọc các bài báo, sách, blog… Hầu hết việc học của bạn sẽ đến từ việc sử dụng Python để xây dựng một cái gì đó. Những vấn đề bạn phải giải quyết sẽ dạy cho bạn rất nhiều.

Tip #11: Đóng góp cho các dự án mã nguồn mở

Trong mô hình nguồn mở, mã nguồn phần mềm là có sẵn, công khai và bất kỳ ai cũng có thể cộng tác. Có nhiều thư viện Python là các dự án mã nguồn mở và bạn được đóng góp vào. Ngoài ra, có rất nhiều công ty công khai các dự án mã nguồn mở. Điều này có nghĩa là bạn có thể làm việc với code được viết và sản xuất bởi các kỹ sư làm việc trong các công ty này.

Đóng góp cho một dự án Python mã nguồn mở là một cách tuyệt vời để tạo ra những trải nghiệm học tập cực kỳ giá trị. Giả sử bạn gửi yêu cầu pull request, người nào quan tâm có thể review lại các thay đổi, hoặc thảo luận các sửa đổi tiềm năng, và có thể theo đó đẩy tiếp các commit của họ nếu cần thiết. Điều này sẽ cho phép bạn tìm hiểu các thực tiễn tốt nhất để lập trình Python, cũng như thực hành giao tiếp với các nhà phát triển khác.

Tiến về phía trước và không ngừng học hỏi. Bây giờ bạn có những chiến lược để học Python rồi đấy, bạn đã sẵn sàng để bắt đầu hành trình Python của mình chưa?

Chúc bạn học Python thật vui và hiệu quả!

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

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

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