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?
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.
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.
Đ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.
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.
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.
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.
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
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
Đượ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
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
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
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
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.
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.
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.
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:
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.
Đâ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.
Lã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.
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.
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.
structNode{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 NULLreturn 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).
structLinkedList{
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:
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.
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).
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.
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.
intRemoveHead(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 điif(l.head ==NULL)
l.tail =NULL;return1;}return0;}
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.
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.
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.
voidPrintList(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;returnNULL;}
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 đó.
Để 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.
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!
#include<iostream>#include"LinkedList.hpp"usingnamespace std;intmain(){// 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 TailAddTail(list, node);}// Print listPrintList(list);
cout << endl;// Get list's lengthint 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 listint 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 nodeDestroyList(list);return0;}
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.
Đâ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.
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.
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.
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.
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 đượ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”
Callback Hell
Hồi sinh viên mình cũng code như thế đấy . 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.
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.
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 javascript. Core.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.
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.
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.
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ạ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.
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 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ộc và tí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ự.
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.
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.
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. Và 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 nghenhữ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.
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
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.
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.
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.
DigitalOcean cung cấp dịch vụ lưu trữ cho phép bạnlư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.
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).
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.
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.
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ư:
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ẻ:
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
[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.
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 #id, inline 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é
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à.
div p.text {font-size:14px;}#header p {font-size:20px;}
Ấ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ẻ p, div, section , 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)
<div style="color: red;">Hello friends</div>
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é.
div p.text {/*2 elements và 1 class ta có (0A,0B,1C,2D)*/font-size:14px;}#header p {/*1 id và 1 element ta có (0A,1B,0C,1D)*/font-size:20px}
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.
<div id="header"><div><div><div><pclass="text">Welcome my friends</p></div></div></div></div>
div div div div p.text {/*5 elements và 1 class ta có (0A,0B,1C,5D)*/font-size:14px;}#header p {/*1 id và 1 element ta có (0A,1B,0C,1D)*/font-size:20px}
À 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
div p.text {font-size:14px!important;}#header p {font-size:20px!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à.
#header div div div p {/*4 elements và 1 id ta có (0A,1B,0C,4D)*/font-size:14px;}#header div p {/*1 id và 2 element ta có (0A,1B,0C,2D)*/font-size:25px;}
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
#header div div div p {/*4 elements và 1 id ta có (0A,1B,0C,4D)*/font-size:14px;}#header div div div p {/*1 id và 4 element ta có (0A,1B,0C,4D)*/font-size:25px;}
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.
#header div div div p.text {/*4 elements 1class và 1 id ta có (0A,1B,1C,4D)*/font-size:14px;}#header div div div p {/*1 id và 4 element ta có (0A,1B,0C,4D)*/font-size:25px;}
Đặ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à
Ở 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ì?
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:
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ó.
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.
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.
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.
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.
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.
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-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.
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:
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.
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.
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.
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.
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:
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:
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.
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.
Resize cửa sổ trình duyệt nhỏ lại thì item3 co lại nhiều hơn:
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:
flex
Thuộc tính flex sử dụng để gộp chung ba thuộc tính flex-grow, flex-shrink và flex-basis.
Thì bạn có thể sử dụng thuộc tính flex một cách ngắn gọn:
flex:13250px;
Giá trị mặc định của flex là:
flex:01auto;
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
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:
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í.
<!DOCTYPE html><html><head><title>Page Title</title><metacharset="UTF-8"><metaname="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:14px20px; 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 --><divclass="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 --><divclass="navbar"><ahref="#">Làng Công nghệ</a><ahref="#">Công nghệ</a><ahref="#">Khoa học</a><ahref="#">Cuộc sống</a></div><!-- Nội dung --><divclass="row"><divclass="side"><h2>Giới thiệu</h2><divclass="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><divclass="fakeimg"style="height:60px;">Ảnh</div><br><divclass="fakeimg"style="height:60px;">Ảnh</div><br><divclass="fakeimg"style="height:60px;">Ảnh</div><h3>Follow Me</h3><p>Facebook</p><p>YouTube</p></div><divclass="main"><h2>Form - Biểu mẫu trong CSS</h2><h5>Quách Tỉnh, 14/02/2019</h5><divclass="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><divclass="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 --><divclass="footer"><h4>Giấy phép số 362/GP-BTTTT. Bộ TT&TT cấp ngày 30/06/2016.</h4></div></body></html>
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:
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.
Code chuẩn Style Guide: Style 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.
Code áp dụng các design pattern phù hợp: Design 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.
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.
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.
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?
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.
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 đó…
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.
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.
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.
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.
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.
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.
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.
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.
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é!
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.
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.
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 [...]
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 [...]
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é!
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 đượ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.
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 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.
Đ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.
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.
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 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.
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 đượ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.
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
Đâ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.
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.
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.
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.
Để 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.
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:
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.
Đừ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.
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.
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.
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?