Home Blog Page 145

7 bí kíp giúp ứng viên deal mức “lương thương lượng”

lương

Bạn băn khoăn không biết làm gì để deal thương hiệu quả? Bạn e ngại vì thiếu tự tin? Và bạn khó khăn trong việc tìm ra cách thức để deal mức “lương thương lượng”. Đừng lo lắng, bài viết sau đây của TopDev sẽ bật mí với bạn 7 bí kíp chinh phục quá trình deal lương một cách “thần sầu”.

Thương lượng qua tin nhắn & Email – Đừng thiếu chuyên nghiệp như thế!

Bạn ngại phải đối mặt trực tiếp (face to face) với sếp/người quản lý khi muốn đề nghị một mức lương tốt. Tốt đó, vì hầu như ai cũng vậy.

  Bí quyết phát triển hoạt động nhân sự qua email (Email Marketing) hiệu quả - Bạn đã biết?
  Recruitment Marketing - Khám phá 4 ý tưởng sáng tạo nội dung

lương

Thế nhưng, việc nỗ lực thương lượng qua tin nhắn hay email là điều cần tránh. Dù bạn có thiếu tự tin cũng không nên hành xử như thế. Bạn sẽ vô tình biến mình thành một nhân viên thiếu chuyên nghiệp.

Thương lương qua tin nhắn hay email cơ bản đã là cách giải quyết kém tinh tế. Bạn sẽ dễ dàng tiếp cận sai cách. Thậm chí nếu kỹ năng chưa hoàn thiện, việc truyền tải mong muốn về lương dễ lệch sang các chiều hướng không tích cực. Ngôn ngữ bạn sử dụng, giọng điệu bạn truyền tải liệu có phù hợp với nhà quản lý? Nếu là một nhân viên thông minh, bạn cần có những cách thức khoa học hơn.

Cụ thể, bạn có thể nói chuyện trực tiếp hoặc thông qua điện thoại. Có rất nhiều công cụ có thể hỗ trợ bạn. Bạn hoàn toàn có thể điều tiết những cảm xúc cá nhân thông qua âm sắc giọng, các hình thức giao tiếp khác nhau như: giao tiếp bằng mắt, giao tiếp bằng ngôn ngữ cơ thể, tốc độ nói,…

Hãy luyện tập chúng trước khi quyết định bước vào cuộc đàm phán về lương.

Quan tâm đến yếu tố sự thật thay vì cảm xúc

Đừng đến gặp nhà quản lý với tâm thế vội vàng! “Tôi nhận thấy bản thân đã đóng góp nhiều thứ”.“Tôi nghĩ mình xứng đáng nhận được một mức lương tốt hơn”. Những cách nói ấy nó sẽ không hiệu quả vì chịu sự chi phối từ cảm xúc cá nhân quá nhiều. Và điều quan trọng, nhà quản lý/cấp trên của bạn dường như không ai quan tâm đến những cảm xúc đang rối loạn của bạn. 

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

lương

Thay vì để cảm xúc lấn át, bạn nên thảo luận với nhà quản lý bằng những minh chứng cụ thể. Hãy dành thời gian tổng hợp và phân tích các nguồn dữ liệu. Sau đó, trình bày với nhà quản lý. Bạn cần thể hiện được các số liệu ấy phản ánh chính xác những thay đổi về tốc độ tăng trưởng về doanh thu, số lượng khách hàng, traffic từ các kênh truyền thông xã hội (Social Media),…

Nếu doanh nghiệp của bạn đang có những dự án lớn, bạn có thể chỉ ra những lợi thế giúp bản thân có thể đảm nhận hoặc hỗ trợ dựa trên hiệu suất làm việc trước đó. Tất nhiên, bạn không nên nói: “Tôi có thể làm được”. Cho dù đó thể hiện sự quyết tâm nhưng nó rất mơ hồ. Thay vào đó, bạn hãy trình bày những nhiệm vụ cụ thể cần thực hiện, càng chi tiết càng hiệu quả. Một bản tóm tắt về kế hoạch hoặc những ý tưởng bất chợt bạn nghĩ ra, nó đều sẽ có ý nghĩa khi thể hiện đúng tầm nhìn chiến lược.

Tính lương gross sang net chuẩn, trải nghiệm ngay!

Những câu hỏi thực tế

Đừng mãi đề cập đến tình hình hiện tại! Bạn cần đặt ra những câu hỏi thực tế đúng trọng tâm. Đó là cơ sở để bạn tìm ra những vấn đề, khía cạnh còn tồn động những rủi ro ảnh hưởng đến sự tiến độ phát triển của công ty. Hãy làm chủ cuộc hội thoại bằng việc khai thác các thông tin từ nhà quản lý. 

lương

Điều này chứng tỏ bạn đang quan tâm đến công ty. Chính lúc này, bạn dễ dàng thương lượng về một mức offer tốt hơn công ty quyết định gia tăng thêm số lương nhiệm vụ.

Hãy cẩn thận vì ranh giời giữa sự thương lượng và những cuộc tranh cãi rất suýt sao. Điều quan trọng là khi thương lượng, bạn cần thể hiện sự nỗ lực hợp tác và làm cách nào để thực hiện hiệu quả những điều này.

Chiến lược thương lương giao tiếp

Để deal lương, bạn cần phải có chiến lược. Và do vậy, việc thiết lập một kế hoạch và hiểu được mục đích của việc làm đó là rất quan trọng. Hãy thiết lập chiến lược và cố gắng hoàn thiện nó một cách tốt nhất.

Xem thêm: Làm thế nào để cải thiện hiệu quả trong giao tiếp?

lương

Intro dạo đầu hãy thể hiện một chút cảm giác về sự hứng khởi. Bạn hãy chia sẻ rằng bạn cảm thấy vui và hào hứng vì có cơ hội trải nghiệm tại đây. Do vậy, bạn cực kỷ mong đợi đồng hành làm việc cùng một team với những đồng đội tuyệt vời. Tiếp đó, chính là thời điểm thích hợp để bạn dẫn dắt qua câu chuyện thương lương.

Cụ thể, bạn có thể áp dụng ý tưởng suy nghĩ dựa trên các thông tin tư duy như dưới đây:

“Vậy tôi có thể chia sẻ về những phúc lợi được không? Tôi nghĩ chắc chắn rằng những nhân viên hoặc một team nếu có nền tảng kiến thức và kỹ năng tốt hơn, họ sẽ nhận được một phúc lợi tốt hơn về lương”. Điều này là khả dĩ. Bởi lẽ, họ tạo ra nhiều giá trị hơn. Họ giúp khai thác và kết nối doanh nghiệp với nhiều thị trường tiềm năng hơn. Đó là sự công bằng dành cho họ.

Khi chia sẻ với nhà quản lý về các cơ sở, bạn bắt đầu quan tâm đến mục đích chính. Hãy thảo luận về việc bạn đã nỗ lực thế nào với những thành tích cụ thể. Kèm theo đó là những phân tích chuyên sâu để gia tăng tính thuyết phục.

Đừng than vãn – phàn nàn, điều đó thật tệ!

Sẽ là trò cười nếu bạn chỉ mãi nói về những khó khăn của bản thân! Đó là cách thức sai lầm khi deal lương. 

Xem thêm: Mãi phàn nàn – than vãn về công ty, xu hướng chung của người mới?

lương

Thay vì nói ra những mong muốn cụ thể, bạn hãy dùng cách nói thể hiện bạn cần một sự phù hợp và xứng đáng hơn dựa trên các giá trị của mình.

“I would be more comfortable with”. Cách nói này thật tinh tếmang giọng điệu tích cực. Đừng quá thẳng thắn!  Một lời đề nghị sẽ mang lại hiệu quả; tạo ra sức mạnh đủ khiến đối phương suy nghĩ là một phát ngôn khôn ngoan.

“Tôi thích công việc. Tôi yêu những gì mình làm và thật sự đang nỗ lực cống hiến vì điều đó. Vì thế, tôi nghĩ mình sẽ nhận được một mức lương tốt hơn.”

Một bí quyết quan trọng chính là đảm bảo mức độ trung tính (neutral) trong phát ngôn deal lương của bạn. Hãy nhớ rằng bạn là người bày tỏ lời đề nghị. Chứ không phải là người tấn công cuộc trò chuyện với nhà quản lý. 

Tôi muốn thể hiện mình thật giá trị!

Khi mong muốn một mức lương tốt hơn đồng nghĩa bạn phải tạo ra nhiều giá trị hơn cho, cống hiến nhiều hơn. Bạn sẽ chấp nhận làm những task khó hơn, đòi hỏi tính chuyên môn cao. Hãy nói về những gì bạn có thể mang lại cho tổ chức. Tất nhiên, nó phải dựa trên cơ sở là phạm vị khả năng và những thành quả cụ thể trước đó của bạn.

Song với đó, bạn phải thật sự quan tâm đến vấn đề nâng cao kỹ năng – trình độ. Hãy chuẩn bị kỹ lưỡng để đảm bảo rằng nhà quản lý không có quá nhiều sự do dự khi đưa ra quyết định về mức thu nhập tiếp theo của bạn. Bạn không phải là người duy nhất đưa ra lời đề nghị. Mà rất nhiều nhân viên khác cũng mong muốn thế. Do vậy, bạn phải đầu tư cho bản thân để sẵn sàng cho mọi sự cạnh tranh.

Xem thêm: Bí quyết deal lương giúp bạn “lật bài ngửa” với nhà tuyển dụng

lương

Ngoài ra, khi deal lương, bạn có thể hỏi về những điều bạn cần cải thiện để bản thân hoàn thiện hơn. Bạn hỏi không phải vì mục đích tạo thiện cảm, hay giả trân với nhà quản lý. Đó là cách bạn thật sự muốn tìm ra những điều giúp bạn trở nên giá trị hơn. Nắm vững những chiến lược này, bạn sẽ tự tin hơn trong việc thương lương với nhà quản lý.

Kết nối sự đồng điệu

Đây là cách thức bạn giao tiếp kết hợp với việc điều tiết cảm xúc qua những phát ngôn mô tả

Cụ thể, bạn sẽ chia sẻ với nhà quản lý bằng chuỗi các phát ngôn có sự kết nối với nhau.

lương

Hãy bắt đầu bằng việc bạn muốn trở thành một team có giá trị trong một tổ chức. Bạn ở đây vì công việc. Và cụ thể, chính là theo đuổi mục tiêu nghề nghiệp và phát triển nó. Bạn cần một mức offer tốt hơn để tạo ra động lực cho những nỗ lực tiếp theo. Bạn có thể đảm nhận những mục tiêu mà công ty đang lên kế hoạch thực hiện. Tuy đó là một quá trình dài nhưng bạn sẽ cố gắng. Hãy thể hiện rằng bạn cũng mong muốn nhận được sự cố vấn, hỗ trợ từ nhà quản lý.

Bạn chấp nhận việc tăng KPI và cam kết cho những thành tích tiếp theo trong một phạm vị khả năng có thể đảm nhận. Tất nhiên, bạn làm điều này không phải chỉ để được tăng lương. Mà lý do thật sự chính là tạo sự gắn kết với cấp trên – những người lãnh đạo. Và bạn nghĩ, bạn xứng đáng nhận được điều đó dựa trên quá trình phát triển của mình.

Lời kết

Deal lương – một mức lương thương lượng là điều không dễ dàng. Hơn hết. bạn cần tìm hiểu, bản thân mình đã làm tốt hay chưa? Đâu là những giá trị bản thân mình đang sở hữu? Và TopDev mong rằng, bạn sẽ hoàn thiện nó. Hãy cho nhà quản lý thấy rằng sự thể hiện (Performance) của bạn đang tiến bộ và phát triển hơn qua từng ngày. Nếu là người lãnh đạo đủ tốt, họ sẽ nhận ra bạn có xứng đáng nhận được một mức lương tốt hơn hay không? Vấn đề quan trọng vẫn nằm ở bạn. Nỗ lực và chứng minh bản thân mình nhiều hơn nhé!

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

Xem thêm Top vị trí tuyển dụng cho it hấp dẫn trên TopDev

How The Back-end Of Banks Embracing Digital Change?

ĐÓN ĐẦU XU THẾ & TỐI ĐA HÓA TIỆN ÍCH TRONG LĨNH VỰC NGÂN HÀNG VÀ CẤU TRÚC BACK-END LIÊN QUAN

Ngân hàng mở (Open Banking) đang trở thành một xu thế mới trong lĩnh vực ngân hàng. Năm 2018 được ghi nhận là năm của “cuộc cách mạng lặng lẽ” ngân hàng mở, đặc biệt tại châu Âu và châu Mỹ. Đến năm 2020, tại Việt Nam, ngân hàng mở đang là từ khóa được quan tâm trong lĩnh vực tài chính, nhất là sau khi Việt Nam đã trải qua 2 đợt chống đại dịch.

Xu thế về Open Banking được dự đoán sẽ ngày một phổ biến hơn ở các nước châu Mỹ và châu u, tuy nhiên, đối với Việt Nam và các nước châu Á thì vẫn chưa. Do đó, một trong những xu hướng mà các ngân hàng có thể lựa chọn vào thời điểm này là xây dựng các Platform Banking trên nền tảng công nghệ số.

Riêng tại Việt Nam, Techcombank chính là một cái tên tiêu biểu, đại diện tiên phong trong việc xây dựng và triển khai Open Banking & Platform Banking.

Trong sự kiện HOW THE BACK-END OF BANKS EMBRACING DIGITAL CHANGE? được thực hiện bởi TECHCOMBANK, đại diện nhóm kiến trúc của Techcombank, anh LÊ HUY PHƯƠNG – @ () sẽ chia sẻ về xu thế mới này trong công nghệ IT của TCB cũng như trong các ngân hàng trên thế giới.

Anh Phương sẽ phần trình bày về Open Banking, Platform Banking sử dụng nền tảng kiến trúc Microservices với những nội dung cụ thể gồm:

  • Các khái niệm về Open Banking & Platform Banking.
  • Trong hạ tầng Back-end, kiến trúc microservices trong việc ứng dụng và xây dựng Open Banking và Platform Banking.
  • Tìm hiểu về quá trình chuyển đổi giữa các mô hình kiến trúc hiện tại sang một nền tảng kiến trúc định hướng về microservices, áp dụng định hướng đến việc xây dựng các nền tảng về Open Banking, Platform Banking.
  • Những practices gần đây nhất trong việc phát triển các nền tảng microservices.
  • Thảo luận về DevOps Pipeline.
  • Trao đổi về Automation Testing trong quy trình DevOps.

Ngoài ra, chương trình sẽ được kết thúc bởi một Panel Discussion với sự tham gia của ba vị chuyên gia đến từ Techcombank hiện đang nắm giữ chủ chốt các yếu trong hạ tầng back-end hiện tại của Techcombank:

  • Anh Trần Hà Thanh – Giám đốc Chuyển đổi kinh doanh Công nghệ
  • Anh Nguyễn Phạm Bách – Giám đốc dự án cao cấp
  • Anh Lê Huy Phương: Kiến trúc sư Doanh nghiệp Mảng, Quản lí kiến trúc Công nghệ

Trước sự thay đổi nhanh chóng trong hành vi của người tiêu dùng, lấy khách hàng làm trung tâm đã không còn là một sự lựa chọn. Hãy tìm hiểu ngay về xu thế mới này để không bị tuột lại phía sau trước những thay đổi của công nghệ!

Time: 9:00 – 11:00 ngày 14/11/2020 tại trang Meetup


LƯU Ý KHI THAM GIA:

Chương trình chỉ livestreams trực tiếp tại website chương trình.
Trước sự kiện 1 ngày, BTC sẽ gửi hướng dẫn tham dự và link truy cập.

Xem ngay các vị trí Backend Developer tuyển dụng trên TopDev

Một số nguyên tắc, định luật trong lập trình

Một số nguyên tắc, định luật trong lập trình

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

Ở bài trước tôi đã giới thiệu với các bạn các bạn Các nguyên tắc thiết kế hướng đối tượng – SOLID. Trong bài này, tôi sẽ giới thiệu với một số nguyên tắc, định luật trong lập trình mà các bạn nên biết để phát triển chương trình của bạn tốt hơn.

Một số nguyên tắc, định luật trong lập trình

The Law of Demeter Principle – LoD

Giới thiệu

The Law of Demeter Principle – LoD, còn gọi khác là nguyên tắc Demeter hay nguyên tắc “càng biết ít càng tốt” hay nguyên tắc “Một dấu chấm”. Nó là một nguyên tắc thiết kế để phát triển phần mềm, đặc biệt là các chương trình hướng đối tượng.

LoD là một triết lý nền tảng của việc lập trình được sinh ra từ một aspect-oriented programming (AOP) project cùng tên, là một trường hợp cụ thể của khớp nối lỏng lẻo (loose coupling).

LoD còn được gọi là nguyên tắc “Một dấu chấm”, nghĩa là không nên gọi quá nhiều dấu chấm (lời gọi hàm), là 1 code smell và sẽ dẫn đến việc code rất dễ vỡ khi có thay đổi.

Quan điểm cơ bản của nguyên tắc này chính là : tối giản sự hiểu biết của 1 object về cấu trúc, thuộc tính của các object khác ngoài nó (bao gồm các thành phần con).

Vì sao phải tuân theo LoD?

Giả sử bạn có một đoạn code sau:

store.getOrder().getCustomer().getBillingAddress().getCity();

Như bạn thấy đoạn code trên không có vấn đề gì. Tuy nhiên, nó vi phạm LoD và có thể gây chút phiền phức cho chúng ta sau này:

  • store về sau có thể sẽ không truy cập BillingAddress qua Customer, Order nữa.
  • Phương thức getCity() trong BillingAddress có thể sẽ không còn tồn tại.
  • Có thể sẽ gặp lỗi: NullPointerException, MethodNotFoundException nếu bất kỳ object order, customer, hay BillingAddress bị null.
  • Khi đóng gói Store để tái sử dụng, cũng cần phải đóng gói cả Order, Customer, BillingAddress. Khi đó, sự phụ thuộc lẫn nhau giữa các thành phần trong hệ thống tăng cao (tightly coupled).

Ưu điểm và nhược điểm của LoD

Cái gì thì có cũng mặt tốt và mặt xấu của nó cả, việc tuân theo LoD cũng vậy. Tùy theo trường hợp thích hợp hãy áp dụng để có được kết quả tốt nhất.

Lợi ích:

  • Class sẽ loosely coupled hơn, những thành phần trong hệ thống sẽ ít phụ thuộc vào nhau hơn.
  • Dễ dàng đóng gói và tái sử dụng.
  • Việc test, bảo trì sẽ dễ dàng hơn.

Bất lợi:

  • Viết nhiều phương thức, class wrapper hơn để có thể gọi được phương thức cần sử dụng.

Thật khó để tuân theo các quy tắc thiết kế này, nhưng một khi hiểu chúng đúng cách, nó sẽ mang đến cho chúng ta lợi ích rất nhiều.

  10 câu nói cực hay về lập trình
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Định luật Brook

Đây là một định luật dựa trên kinh nghiệm thực tế : “Đưa thêm người vào 1 project đang chậm, sẽ chỉ khiến nó càng chậm hơn.”

Hay có thể nói theo một cách khác nữa là “Tập hợp 9 bà bầu lại cũng không thể khiến đứa trẻ ra đời sau 1 tháng.”

Luận thuyết cơ bản của định luật này là

  • Cần thời gian để quen với project
  • Công sức dành cho việc communication sẽ tăng

http://en.wikipedia.org/wiki/Brooks’s_law

Định luật Conway

“Organizations which design systems … are constrained to produce designs which are copies of the communication structures of these organizations.”

“Một công ty thiết kế hệ thống thế nào cũng sẽ làm ra những thiết kế giống y hệt với thiết kế hệ thống của chính công ty họ.”

http://en.wikipedia.org/wiki/Conway’s_law

Nghiên cứu gần đây chỉ ra rằng hệ thống của công ty là nhân tố ảnh hưởng lớn nhất đến vấn đề phát sinh ra bug của sản phẩm.

http://research.microsoft.com/apps/pubs/default.aspx?id=70535

Nguyên tắc bất ngờ nhỏ nhất (least astonishment)

Trong trường hợp trên cùng 1 interface có 2 yếu tố hành xử mâu thuẫn với nhau, hoặc cách hành xử không rõ ràng thì cần phải chọn cách hành xử nào gây bất ngờ ít nhất cho người sử dụng.

http://en.wikipedia.org/wiki/Principle_of_least_astonishment

Đây là 1 nguyên tắc về giao diện người dùng. Một ví dụ đơn giản :

  • Trên 1 interface có 2 chức năng :
  • Ấn ctrl+Q để thoát chương trình.
  • Nhập macro (lưu 1 tổ hợp phím mang 1 chức năng nào đó để tiện cho việc sử dụng về sau).
  • Sẽ có trường hợp user muốn dùng Ctrl+Q cho macro của mình, nên hành xử đúng với nguyên tắc bất ngờ nhỏ nhất chính là : trong khi nhập macro thì ctrl+Q được coi như là tổ hợp phím bình thường, không phải là lệnh tắt chương trình. Đây chính là điều gây bất ngờ ít nhất cho người dùng.

Nguyên tắc Boy Scout

Nguyên tắc của các tổ chức Boy scout chính là : lúc đi phải sạch đẹp hơn lúc đến.

Trong lĩnh vực lập trình thì nguyên tắc đó sẽ được hiểu là “Khi bạn check-in một module thì lúc đó nó phải đẹp hơn lúc bạn check-out.”

Nguyên tắc YAGNI

Viết tắt của “You aren’t gonna need it” – Cái (chức năng, phần) ấy rồi sẽ không cần thiết.

Đó là một câu khẩu ngữ nhắc nhở người lập trình rằng trong quy trình Extreme Programming (lập trình cực hạn) thì : “Chưa phải lúc cần thiết thì chưa được phép làm.”

http://en.wikipedia.org/wiki/YAGNI

Nguyên tắc DRY

Viết tắt của “Don’t repeat yourself” – với ý nghĩa là “Đừng lặp lại những gì giống nhau”.

http://en.wikipedia.org/wiki/Don’t_repeat_yourself

Khi nguyên tắc này được áp dụng tốt, dù ta có thay đổi 1 phần thì những phần không liên quan cũng sẽ không bị thay đổi theo. Hơn nữa, những phần có liên quan sẽ được thay đổi cùng 1 lượt, giúp ích rất nhiều cho cả khâu estimate và khâu thực hiện.

Nguyên tắc KISS

Viết tắt của “Keep it simple, stupid” – “Cứ đơn giản thôi, đồ ngu!”. Đây là 1 triết lí của Hải quân Mỹ.

http://en.wikipedia.org/wiki/KISS_principle

Những triết lý tương tự có thể kể đến là :

  • Phương châm dao cạo Okham (Okham’s razor) : Không đưa ra nhiều giả thiết nếu không cần thiết. Cái gì cần ít giả thiết để chứng minh sẽ không thể chứng minh được bằng nhiều giả thiết.
  • Albert Einstein : Làm cái gì cũng nên đơn giản nhất có thể, nhưng đơn giản quá thì không được.
  • Leonardo da Vinci : Đơn giản nhất chính là điêu luyện nhất.
  • Antoine de Saint- Exupéry : Hoàn hảo, không phải là không thêm vào được nữa, mà là không thể bớt đi được nữa.

Nguyên tắc SOLID

Tập hợp những nguyên tắc trong lập trình hướng đối tượng. Các chữ cái đầu hợp lại thành SOLID.

http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

  • SRP (Single Responsibility Principle) : Một class chỉ nên giữ 1 trách nhiệm duy nhất, chỉ có thể sửa đổi class với 1 lý do duy nhất.
  • OCP (Open/closed principle) : Có thể thoải mái mở rộng 1 class, nhưng không được sửa đổi bên trong class đó.
  • LSP (Liskov substitution principle) : Trong một chương trình, các object của class con có thể thay thế class cha mà không làm thay đổi tính đúng đắn của chương trình.
  • ISP (Interface segregation principle) : Thay vì dùng 1 interface lớn, ta nên tách thành nhiều interface nhỏ, với nhiều mục đích cụ thể.
  • DIP (Dependency inversion principle) : Các module cấp cao không nên phụ thuộc vào các modules cấp thấp. Cả 2 nên phụ thuộc vào abstraction. Interface (abstraction) không nên phụ thuộc vào chi tiết, mà ngược lại. ( Các class giao tiếp với nhau thông qua interface, không phải thông qua implementation.)

Nguyên tắc này đã được tôi viết khá kỹ trong bài viết “Các nguyên lý thiết kế hướng đối tượng – SOLID“. Các bạn có thể tham khảo thêm ở đây.

Tổng hợp CSS tips tricks hay mà có thể bạn chưa biết

Tổng hợp CSS tips tricks hay mà có thể bạn chưa biết

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

Khi các bạn bắt đầu với một dự án nào đó hay là tự học code đi chăng nữa thì chắn hẳn các bạn sẽ gặp rất nhiều vấn đề khác nhau, như lỗi này lỗi nọ… Thì trong bài viết này mình sẽ tổng hợp các lỗi mà các bạn có thể sẽ gặp cũng như các tips tricks hay mà chúng ta có thể biết thêm để nâng cao trình độ nhé. Bắt đầu thôi nào!

Center với text-align

Khi các bạn làm việc với các khối hay hình ảnh có HTML đơn giản như sau, thì các bạn muốn cho hình ra giữa các bạn sẽ dùng display: block cho tấm hình rồi sau đó dùng margin: 0 auto.

Tuy nhiên nếu tấm hình đó bắt buộc không dùng display: block mà là inline-block thì sao ? Lúc này margin: 0 auto cho thẻ inline sẽ không có tác dụng. Để xử lý trường hợp này các bạn sẽ dùng text-align: center cho class .image bao bên ngoài là sẽ được nhé.

Gradient cho chữ

Chắc hẳn các bạn không lạ với việc dùng gradient cho background, tuy nhiên nếu muốn dùng gradient cho chữ thì làm thế nào ? Các bạn có thể làm được điều đó với thuộc tính -webkit-background-clip: text nhé. Khi áp dụng vào một dự án nào đó thì các bạn nên kiểm tra xem các trình duyệt mình làm có hỗ trợ thuộc tính này không nhé.

Giả sử các bạn muốn dùng nó nhưng sợ gặp trình duyệt không hỗ trợ sẽ lỗi vì thuộc tính color các bạn đã thiết lập trong suốt rồi, lúc này ta sẽ sử dụng @supports để xử lý trường hợp này. @supports sẽ kiểm tra xem trình duyệt có hỗ trợ thuộc tính đó không, nếu có thì áp dụng một đoạn CSS nào đó

Với đoạn code trên thì mặc định class .text sẽ có chữ màu cam, nhưng gặp trình duyệt hỗ trợ thuộc tính -webkit-background-clip: text thì nó sẽ áp dụng gradient.

Thiết lập max-width cho hình ảnh

Đôi khi chúng ta code có sử dụng nhiều hình ảnh rất to, nhưng khung chứa thì rất nhỏ dù đã thiết lập chiều rộng hay độ cao mà hình ảnh không có thu vào mà vẫn to như ảnh gốc ban đầu. Thì lúc này các bạn nên xem lại hình ảnh có dùng max-width chưa nhé.

Khi sử dụng hình nền đừng quên thiết lập độ rộng và chiều cao, nếu không hình nền sẽ không hiển thị. Và sử dụng :before hay :after thì đừng quên thuộc tính content.

  3 điều bạn có thể không biết về biến trong CSS
  5 điều phiền toái nhất của CSS

Fonts không hiển thị đúng

Khi các bạn thiết lập dự án ban đầu, các bạn sẽ thường thiết lập font-family trên body chẳng hạn để áp dụng cho toàn trang, tuy nhiên các thẻ như input, textarea, select, button sẽ không nhận mà nó lấy dựa theo mặc định của trình duyệt. Để xử lý trường hợp này các bạn phải CSS thêm font-family cho các thẻ này

Hình ảnh hiển thị bị méo

Khi các bạn dùng thẻ img trong một khung nào đó chẳng hạn có kích thước là 50×50 mà hình của bạn là 135×275 thì lúc này hình của bạn sẽ hiển thị không được đẹp vì thế đừng quên sử dụng thuộc tính object-fit: cover để xử lý trường hợp này nhé.

Thẻ label không phải để chưng

Khi các bạn dùng thẻ label thì sẽ có thuộc tính for="" đi kèm, ở trong for này giá trị truyền vào chính là id của một input nào đó ví dụ

Lúc này khi nhấn vào thẻ label thì input với id tương ứng chỗ for sẽ được focus.

Xử lý khi liên kết dài hoặc chữ dài

Chắc hẳn khi các bạn làm giao diện layout thì việc hiển thị nội dung ra là chuyện đương nhiên và nội dung này được nhập từ người dùng. Ví dụ họ nhập 1000 chữ a dính nhau thì lúc này giao diện của các bạn sẽ hiển thị scroll ngang và sẽ làm xấu giao diện chẳng hạn. Để xử lý trường hợp này các bạn chỉ cần dùng như sau, ví dụ là class .text.

Đừng sử dụng space-between khi làm việc với dữ liệu động

Khi các bạn làm việc với flexbox và sử dụng thuộc tính này với dữ liệu được đổ ra linh động thì lúc này có thể layout của các bạn sẽ hiển thị như thế này

Tổng hợp CSS tips tricks hay mà có thể bạn chưa biết

Để xử lý trường hợp này các bạn có thể nghiên cứu dùng CSS Grid hoặc thay vì dùng space-between thì các bạn để mặc định là flex-start, sau đó chia % cho các phần tử và dùng hàm calc để tính toán khoảng cách giữa chúng, ví dụ khoảng cách giữa chúng là 20px. Ta có

Mình có viết một bài về trường hợp này rồi. Các bạn có thể nhấn tại đây để đọc nhé.

Đừng quên flex-wrap

Khi các bạn làm việc với Flexbox và dùng chỉ display: flex thì lúc này flex-wrap được thiết lập mặc định là nowrap nghĩa là các phần tử sẽ luôn nằm cùng một hàng cho dù lớp bao ngoài không đủ chứa đi nữa và có khi xuống màn hình nhỏ như điện thoại sẽ xuất hiện scroll ngang. Lúc này đơn giản là thay nowrap thành wrap là xong.

Chú ý với button

Khi các bạn dùng thẻ button thì ở trình duyệt như Chrome thì hiển thị bình thường nhưng ở Safari thì có màu nền làm xám. Để xử lý trường hợp này các bạn thiết lập màu nền mặc định là transparent là ok.

Border bị mất 1 phần khi zoom

Khi làm việc với các thẻ như input chúng ta thường code border: 1px solid #eee chẳng hạn, thì trên trình duyệt Chrome hay Safari lâu lâu sẽ bị mất border ở dưới hoặc bên trái, để fix trường hợp này mình đã Google và thấy nếu dùng 1px thì chúng ta có thể thay bằng thin

Sử dụng :empty để ẩn thành phần trống

Khi code với dữ liệu động được đổ ra từ database thì sẽ có đôi lúc dữ liệu chưa có thì lúc này ví dụ bạn sẽ có HTML như này <p></p> và nó có margin thì giao diện chắc chắn sẽ bị trống 1 phần nào đó, lúc này bạn muốn ẩn những thẻ <p> mà không có nội dung thì đơn giản chúng ta có thể dùng pseudo :empty nhé

Hiển thị dấu … khi nội dung quá dài

Khi các bạn chỉ muốn một tiêu đề nào đó chỉ hiển thị trên một dòng và nếu quá dài thì sẽ bị cắt đi và hiển thị dấu 3 chấm thì chúng ta có thể dùng như thế này

Tuy nhiên bạn không muốn hiển thị trên một dòng mà là 3 hoặc 4 dòng rồi mới có dấu 3 chấm thì ta cũng có một cách khác để xử lý trường hợp này

Responsive iframe, video

Khi chèn các iframe video từ các bên thứ ba như Youtube hay Vimeo thì việc trình phát hiển thị không có responsive khi gặp các màn hình nhỏ như tablet hay mobile là chuyện bình thường. Để xử lý việc này thì mình có tìm hiểu và thấy người ta code về tỉ lệ là 16:9 để cho hiển thị video được responsive tốt trên tất cả các màn hình. Ví dụ ta có HTML như sau

Thì chúng ta sẽ dùng đoạn code này để làm cho chúng responsive

Và còn nhiều nữa khi có mình sẽ cập nhật lên đây. Chúc các bạn ngày tốt lành và mạnh khoẻ nhé.

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

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

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

Một số câu hỏi hay gặp khi phỏng vấn vị trí lập trình Java

Một số câu hỏi hay gặp khi phỏng vấn vị trí lập trình Java

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Các câu hỏi chung như giới thiệu về bản thân, trước đó em làm công ty nào, sao nghỉ việc, mức lương em mong muốn ra sao… tạm thời mình không đề cập tới vì cái này tùy từng trường hợp và năng lực mỗi người =)). Mình sẽ chỉ đề cập tới vấn đề kỹ thuật khi đi phỏng vấn thôi nhé.

Một số câu hỏi hay gặp khi phỏng vấn vị trí lập trình Java

Phỏng vấn thực tập, freshser

Với những bạn mới ra trường thì phỏng vấn sẽ nhẹ nhàng, chủ yếu đánh giá kiến thức nền tảng của các bạn.

1. Lập trình hướng đối tượng là gì?

Trả lời: lập trình hướng đối tượng là 1 kỹ thuật lập trình, cho phép lập trình viên trừu tượng hóa các đối tượng thực tế thành các đối tượng trong code

2. Các tính chất của lập trình hướng đối tượng trong Java?

Trả lời: Có 4 tính chất (tính trừu tượng, tính đóng gói, tính kế thừa, tính đa hình)  https://stackjava.com/oop/cac-tinh-chat-huong-doi-tuong-cua-java.html

3. Hỏi về collection Framework (Cái này hầu như 100% ở đâu phỏng vấn cũng hỏi).

  • Sự khác nhau giữa Set với Map
  • Sự khác nhau giữa Linklist với Arraylist; Vector với Arraylist; HashTable với HashMap

4. Sự khác nhau giữa Hashcode và Equals.

Trả lời: https://stackjava.com/java/hashcode-va-equals-trong-java.html

5. Immutable là gì? Cách để tạo đối tượng immutable? 

Trả lời: https://stackjava.com/java/immuable-la-gi.html

6. Sự khác nhau giữa abstract class và Interface.

Trả lời: https://stackjava.com/oop/su-khac-nhau-giua-abstract-class-voi-interface-trong-java.html

(* Chú ý: Từ Java 8 và Java 9, có khá nhiều thay đổi đối với Interface)

7. Khái niệm DI là gì? 

Phần này thường hỏi đối với người đã có kinh nghiệm đi làm.

Trả lời:

8. Hỏi về các design pattern (1 số design pattern quen thuộc).

Phần này thường hỏi đối với người đã có kinh nghiệm đi làm.

Trả lời:

9. Hỏi về thuật toán.

1 số thuật toán quen thuộc như DFS, BFS, các thuật toán đồ thị, tìm kiếm…, thường thì phần này sẽ rơi vào phần làm bài test nhưng đôi khi cũng sẽ hỏi miệng chủ yếu để xác định bạn có biết tới những thuật toán đó không.

10. Hỏi về các dự án bạn đã làm, nghiên cứu.

Dự án ở đây là các bài tập lớn bạn đã làm, đồ án tốt nghiệp.

Để tạo ấn tượng tốt bạn nên có 1 số project trên github đối với các bài tập lớn của mình hoặc tham gia viết bài trên một blog nào đó về lập trình.

11. Hỏi về khả năng tự học, tiếp cận/giải quyết vấn đề.

Cái này chủ yếu về cách mà bạn giải quyết vấn đề, tiếp cận cái mới. Thí dụ cách mà bạn search google cũng được đánh giá khá cao.

Ví dụ: nhà tuyển dụng hỏi bạn: “em làm chức năng Login” hết bao lâu thời gian thì đừng trả lời mà phải hỏi lại là chức năng login như nào, áp dụng công nghệ nào, các role, permission ra sao…

Hỏi về những kỹ thuật, ngôn ngữ nào mà bạn tự học, tìm hiểu?

Đặc biệt nếu bạn đọc nhiều sách về lập trình thì sẽ được đánh giá rất cao. Một số sách hay về Java như: Sun Certified Programmer for Java®Platform; Clean Code, Java Effective.

Tuyển dụng lập trình Java lương cao

  'Toát mồ hôi' phỏng vấn tuyển dụng vào Apple

Phỏng vấn với vị trí có kinh nghiệm

Đối với vị trí yêu cầu kinh nghiệm thì yêu cầu cao hơn, các nhà phỏng vấn sẽ đánh giá nhiều về những gì bạn đã làm được.

Giả sử bạn giỏi, kinh nghiệm 2,3 năm nhưng bạn chỉ xào đi xào lại 1 dự án, chẳng có công nghệ, framework gì mới thì sẽ bị đánh giá rất thấp do đó những năm đầu đi xin việc mọi người đừng quá quan tâm vào lương mà hãy để ý xem nơi mình vào làm sẽ giúp mình học được gì, phát triển được gì.

Và thông thường nếu chỉ tầm 3 năm kinh nghiệm trở xuống thì bạn sẽ vẫn gặp những câu hỏi cơ bản giống như lúc tuyển fresher

1. Bạn đã làm những dự án nào? dự án đó làm cái gì, kích thước dự án ra sao và đóng góp vào dự án của bạn là gì?

2. Bạn biết những kỹ thuật, công nghệ, framework gì?

Cái này chủ yếu để xác định xem bạn có phù hợp với vị trí ứng tuyển không.

Ví dụ công ty đang làm về JSF và đang rất cần người biết về JSF nhưng bạn lại chỉ biết Spring thì sẽ không được ưu tiên bằng các ứng viên khác. Một số ít công ty thì chủ yếu maintain các dự án cũ nên sẽ làm nhiều về Struts (cái này giờ ít dùng), thậm chí có lần mình phỏng vấn 1 công ty mà sản phẩm của họ không hề dùng các công nghệ mới chỉ vì sản phẩm của họ đang ổn định.

3. Hỏi sâu về kiến thức mà bạn bảo mình biết 🙂

Phần này sẽ là phần đánh giá chủ yếu về kỹ thuật, nó giúp nhà tuyển dụng đánh giá những gì bạn trình bày có đúng ko.
Ví dụ:

  • Bạn bảo mình làm về Spring thì sẽ hỏi đại loại như Spring có những module nào? DI trong Spring như nào;
  • Bạn bảo mình biết JSF thì sẽ hỏi JSF có những phase nào…
  • Về Hibernate thì hỏi hibernat khác gì JPA, save – saveOrUpdate – merge khác gì nhau…
  • Hỏi về REST, maven…

Nếu cái gì bạn không biết thì ko nên đề cập tới trong CV. Nếu có hỏi tới thì cứ thoải mái thừa nhận là phần đó em chưa làm nhiều.

4. Ở các vị trí cao hơn

Với người có kinh nghiệm làm leader, hoặc kinh nghiệm lâu năm 8,9 năm gì đó thì sẽ hỏi nhiều về kiến trúc, pattern, cách lead team.

Kết.

Chú ý lúc phỏng vấn cũng là lúc bạn phỏng vấn ngược lại để biết được mình sẽ làm việc với ai, làm về cái gì, khả năng phát triển/ học hỏi được ở công ty ra sao.
Và đừng ngại đi phỏng vấn, mình phỏng cũng có lần tạch, cũng nhận được khá nhiều lời mời. Sau mỗi lần như thế bạn sẽ thể hiện mình tốt hơn trước nhà phỏng vấn.
Chúc bạn tự tin khi đi phỏng vấn nha!

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

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

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

Tại sao Facebook không sử dụng responsive?

Tại sao Facebook không sử dụng responsive?

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

Responsive ngày này gần như là yêu cầu bắt buộc phải có khi thiết kế Website. Tuy nhiên, mỗi khi truy cập vào https://facebook.com thì giao diện y như những trang Web năm 2000. Xấu không chịu được. Vì thế, Facebook tìm ra cách giải quyết là tạo một bản Mobile Version tại https://m.facebook.com. Facebook là một trong những công ty to nhất thế giới, nhưng tại sao họ lại không dùng responsive mà phải dùng một bản Mobile Version?

Tại sao Facebook không sử dụng responsive?
Photo by Austin Distel / Unsplash

Responsive là gì?

Trước khi đi vào chém gió về lý do tại sao, thì nhắc lại thế nào là responsive đã nhỉ.

Responsive Web Design is about using HTML and CSS to automatically resize, hide, shrink, or enlarge, a website, to make it look good on all devices (desktops, tablets, and phones) – W3Schools.

Hay nói đơn giản thì responsive là cách cách thiết kế giao diện thân thiện cho mobile hay tablet.

Tại sao Facebook không sử dụng responsive?
Ví dụ về Responsive
  20+ nguồn tuyển dụng và chia sẻ kiến thức IT hiệu quả trên Facebook
  Bài học cho các Developer sau lỗi bug video từ Facebook

Vậy thì tại sao Facebook lại không sử dụng Responsive?

Responsive không phải là cách duy nhất để thiết kế “Giao diện thân thiện” cho Mobile và Tablet

Nhiều người nghĩ rằng chỉ có một cách để thiết kế Website chạy tốt trên các trình duyệt di động là responsive. Nhưng nghĩ lại một chút thì trước khi có responsive thì vẫn có một cách để các giao diện chạy tốt trên điện thoại mà? Đó là người ta sử dụng một Mobile Version để chạy các Website trên di động. Thường thì sẽ là http://m.domain.com. Và đây chính là cách Facebook hay một số Website khác như Twitter cũng đang làm.

Facebook không phụ thuộc hay liên quan gì đến với Google

Tại sao lại lôi Google vào đây? Google sỡ hữu một công cụ tìm kiếm mạnh nhất quả đất hiện tại. Chính vì thế, các Website sau này đều muốn được xuất hiện trong top 100 tìm kiếm của anh Gồ. Mà để muốn lọt được vào top 100 thì phải SEO. Mà muốn SEO được thì Website phải được responsive. Nhưng với Facebook thì hoàn toàn khác. Facebook là một mạng xã hội lớn nhất hiện tại. Chính vì thế Facebook vẫn sống tốt sống khỏe mà không cần phải xuất hiện quá nhiều vào trong kết quả tìm kiếm của Google. Cho nên Facebook cũng không cần phải responsive.

Facebook quá phức tạp để responsive

Nếu một Website đơn giản hơn, ít tính năng thôi thì việc responsive không phải là một vấn đề quá lớn, quá phức tạp. Nhưng Facebook lại là một mạng xã hội quá lớn, kèm theo đó là ngàn nghìn tính năng trong trang Web của họ. Vậy thì responsive là một phương án không hề tối ưu. Chính vì vậy, việc có một tên miền khác cho mobile sẽ giúp giải quyết triệt để vấn đề này. Một website khác sẽ đồng nghĩa với hiện HTML khác, CSS khác, và Javascript cũng viết lại. Nó sẽ tiện hơn cho việc tối ưu hóa hiển thị trên di động, ngay cả trên các thiết bị cũ đời Tống. Bản mobile của Facebook hoàn toàn được viết bằng HTML, CSS và Javascript. Không có bất cứ một Framework Front End xịn xò nào như React. Bạn hoàn toàn có thể Crawl dữ liệu từ phiên bản mobile này. Hơn nữa, việc làm bản Mobile Version cho Facebook sẽ giúp Facebook linh động hơn trong việc tối ưu hóa trải nghiệm người dùng. Chẳng hạn khi thêm một tính năng mới thì sẽ dễ implement vào bản Mobile hơn.

Giúp tải trang nhanh và ổn định hơn

Facebook Desktop thì nó nặng như thế nào thì các bạn biết rồi chứ? Các bạn cứ thử bật 20 tab Facebook đi thì thấy nó như nào. Mà khi sử dụng responsive, đồng nghĩa với việc nó sẽ phải tải toàn bộ HTML5 của bản Desktop ngay trên Mobile, mặc dù không hề dùng đến. Điều này sẽ làm trải nghiệm của người dùng ở bản responsive trở nên tệ hại. Chính vì việc này nên mình nghĩ đó là lý do tại sao giao diện mobile của Facebook xấu hoàn toàn. Ở trên mobile thì mình nghĩ ưu tiên cao nhất là tốc độ và độ ổn định, chứ không hẳn là phải đẹp, phải hoành tráng. Facebook đã đánh đổi cái đẹp của bản mobile để đổi lấy tốc độ và ổn định.

Bài học rút ra

Nếu như một trang Web có quá nhiều tính năng phức tạp, cộng với việc không cần SEO trên Google thì việc đơn giản hơn là hì hục ngồi responsive thì cứ làm một bản Mobile Version cho nó nhẹ đầu. Đỡ nghĩ ngợi lung tung, phức tạp.

Tại sao Facebook không sử dụng responsive?

Kết luận

Trên đây là một số ngụ ý cá nhân của mình về câu hỏi “Tạo sao Facebook không sử dụng responsive?” sau khi đọc một số bài về responsive cũng như lê la trên Quora chiều hôm nay. Hy vọng các bạn sẽ thích.

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

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

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

4 ngôn ngữ phát triển game indie phổ biến

Game indie

Game indie là dòng game được phát triển bởi cá nhân, hay tổ chức nhỏ mà không có sự hỗ trợ tài chính nào từ các ông lớn ngành Game. Cũng chính vì thế, game indie chủ yếu tập trung và cốt truyện, nhân vật hơn là đồ họa. 

Một điểm khá hay ở game indie chính là mục đích tạo ra game không vì lợi nhuận như các game ở các hãng lớn. Nếu muốn thử sức với dòng game indie, hãy cân nhắc các ngôn ngữ lập trình sau:

Ngôn ngữ hướng đối tượng C++

C++ khá khó học, tuy nhiên lại rất phổ biến vì C++  cấp quyền kiểm soát hardware cũng như đồ họa cần thiết để thiết kế video game. Và vì nó là ngôn ngữ hướng đối tượng nên cấu trúc bên trong sắp xếp code thành các block có thể tái sử dụng lại các đoạn code sau này. 

Ngôn ngữ C++ khá phù hợp với những bạn mới bắt đầu, bởi khi bạn đã thành thạo ngôn ngữ nền tảng như vậy thì quá trình tìm hiểu ngôn ngữ mới cũng sẽ đơn giản hơn. Game Starbound (kiểu game phiêu lưu hành động) cũng được phát triển bởi C++.

Xem tuyển dụng Game Developer tại các công ty hàng đầu trên TopDev

Ngôn ngữ hướng đối tượng Java

Ngôn ngữ Java được nhiều dev lựa chọn vì nó hỗ trợ đa luồng – multithreading nên ít tốn bộ nhớ hơn, đồng thời tối đa hóa CPU. Các game được phát triển trên nền Java rất dễ tương thích với nhiều device khác nhau vì chạy trên máy ảo (virtual machine). Tựa game nổi tiếng – Minecraft, trước khi bán cho Microsoft thì được tạo ra từ Java bởi Markus Persson và trở thành video game bán chạy nhất mọi thời đại.

Ngôn ngữ đánh dấu HTML5

HTML5 phát triển trên nền tảng HTML và được sử dụng để design, cấu trúc diện mạo của web, và hiển thị content web. Các content đa phương tiện có thể thêm vào mà không cần Flash hay plug-in từ bên thứ ba. Thậm chí có thể truy cập website mà không cần Internet, rất đáng để cân nhắc phát triển game. Tựa game rất classic – Bejeweled được viết bằng HTML5.

Ngôn ngữ kịch bản JavaScript

Là ngôn ngữ lập trình và ngôn ngữ script phổ biến nhất giới lập trình, JavaScript được dùng để cung cấp trải nghiệm mượt mà hơn, cùng với với các chức năng tự động update các trang web, cải tiến UI như hình ảnh, animation, video, .. Với sự hỗ trợ từ API, các chương trình khó và cao cấp hơn cũng hoàn toàn khả thi với JavaScript, Ví dụ như tựa game Angry Birds cũng chạy trên nền tảng JavaScript.

Tùy vào lựa chọn design mà bạn có thể chọn ngôn ngữ build game phù hợp cho bản thân. Sau khi chọn được rồi thì hãy bắt tay và tạo ra một chiếc game indie của riêng mình nhé.

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

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

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

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

Nhiều người vẫn nghĩ rằng xinh đẹp và thông minh sẽ không tồn tại trên cùng một người, nhưng bài đăng này sẽ khiến bạn thay đổi suy nghĩ. Như chúng ta đều biết rằng Hacking là một khía cạnh phức tạp thực sự đòi hỏi kỹ năng kỹ thuật rất lớn. Vì vậy, AnonyViet đã thống kê danh sách những nữ hacker xinh đẹp và khét tiếng nhất, những người đã giành được vị trí này và đạt được một số cột mốc về hacker mũ trắng. Bạn có thể thấy họ trong một số tổ chức blue-chip, cơ sở công nghiệp và các công ty lớn.

Adeanna Cooke

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

Adeanna Cooke là một cựu người mẫu Playboy, và thật thú vị làm sao sau khi được thuê cho một buổi chụp ảnh bình thường, một trong những người bạn cũ của anh ấy muốn kiếm tiền bằng cách đặt khuôn mặt của cô ấy lên một cơ thể khác mà không mặc quần áo bằng cách chụp ảnh.

Nhưng, khi nhìn thấy những bức ảnh trần trụi trên một số trang web trái phép ngẫu nhiên, cô ấy đã ngay lập tức tự tay mình hack trang web mà không hề thông báo hay nhờ đến chính quyền.

Về cơ bản, Adeanna Cooke nổi tiếng với kỹ năng hack có đạo đức và cô là một hacker tự đào tạo. Cô cũng hỗ trợ phụ nữ và những người mẫu khác trong những hoàn cảnh tương tự. Do đó, ngay sau khi tìm thấy thành công trong nỗ lực của mình, Adeanna Cooke đã trở thành “nàng tiên hacker”.

Xem thêm:  PHÁ HỦY MÁY TÍNH CỦA BẠN VỚI “USB SÁT THỦ” THẾ HỆ THỨ 3

Xiao Tian

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

19 tuổi Xiao Tian là “tướng lĩnh” mới của đội quân nữ Hacker Trung Quốc. Chỉ mới cuối tuổi thiếu niên, cô đã trở nên nổi tiếng khi thành lập nhóm “China Girl Security Team”.

Cho những ai chưa biết, ‘China Girl Security Team’ là một nhóm tin tặc, đặc biệt là phụ nữ, lớn nhất ở Trung Quốc hiện tại, có hơn 3000 thành viên, và đang tiếp tục tăng lên.

Như Xiao Tian cảm thấy rằng không có tiếng nói riêng dành cho những cô gái tuổi teen như cô trong thế giới hack do nam giới thống trị.

Anna Chapman

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

Anna Chapman là một nữ hacker người Nga, sinh ngày 23 tháng 2 năm 1982 và bị bắt tại thành phố New York khi cô bị phát hiện cùng 9 người khác với tội danh làm việc cho tổ chức gián điệp Illegals Programme thuộc cơ quan tình báo đối ngoại của Liên bang Nga.

Anna Chapman bị cáo buộc phạm tội âm mưu hoạt động như một đặc vụ của chính phủ nước ngoài mà không thông báo cho Bộ trưởng Tư pháp Hoa Kỳ và bị trục xuất về Nga vào ngày 8 tháng 7 năm 2010, như một phần của hiệp ước trao đổi tù nhân giữa Hoa Kỳ và Nga.

Ying Cracker

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

Ying Cracker là một trong những nữ hacker xinh đẹp nhất thế giới và là giáo sư ở Thượng Hải, Trung Quốc, người dạy mọi người những kiến ​​thức cơ bản về “Cách bắt đầu hack”, “Cách thay đổi địa chỉ IP của bạn” và “Cách xóa mật khẩu Office”…

Cô ấy trở nên nổi tiếng trong một Diễn đàn được gọi là “Những hacker hấp dẫn người Trung Quốc”, nơi cô ấy có một lượng lớn người hâm mộ. Hơn nữa, công việc của Ying Cracker rất đáng chú ý, là một chuyên gia trong các khóa học về hack, viết và kiếm tiền bằng các khóa học về các công cụ này, và cô ấy cũng giúp những người khác bẻ khóa (bẻ khóa) phần mềm.

Xem thêm:  Avira Phantom VPN Pro V2.29 Full – Phần mềm VPN nhanh, an toàn

Nhưng, điều thú vị nhất là thành tích của cô đã đổi họ thành CRACKER.

Kristina Svechinskaya

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

Tên đầy đủ của Kristina Svechinskaya là “Kristina Vladimirovna Svechinskaya”, sinh ra tại thành phố Irkutsk, đây là trung tâm hành chính của Irkutsk Oblast, và là một trong những thành phố đông dân nhất ở Siberia, Nga. Vào ngày 16 tháng 2 năm 1989, cô đến Hoa Kỳ, nơi cô đang là sinh viên của Trường Kinh doanh Stern thuộc Đại học New York và làm phục vụ bàn.

Đôi mắt xanh nhạt và vẻ đẹp lai Nga nổi bật của cô đã khiến cô trở thành một trong những “Hacker xinh đẹp nhất”, khi cô bị bắt ở New York, Hoa Kỳ, vào đầu tháng 10 năm 2010, vì bị buộc tội tích hợp một mạng lưới lừa đảo Internet, nơi có phần mềm độc hại, virus và Trojan đã được sử dụng để đánh cắp 35 triệu USD từ một số tài khoản ngân hàng của Hoa Kỳ và sử dụng hộ chiếu giả.

Kim Vanvaeck

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

Cô còn được gọi là Gigabyte. Kim Vanvaeck đến từ Bỉ, và cô được biết đến với tác phẩm Virus. Một mình cô ấy đã tạo ra một số loại virus cao cấp có khả năng đánh cắp thông tin nhạy cảm từ bất kỳ hệ thống nào và cũng có thể phá hủy chúng. Cô ấy đã viết về một số loại virus như Quis, Coconut, Sahay và YahaSux.

  Giới thiệu 15 website học và luyện hack hợp pháp

Joanna Rutkowska

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

Tất cả chúng ta đều biết rằng không phải tất cả hacker đều Xấu, Joanna Rutkowska là bằng chứng. Cô là một nhà nghiên cứu bảo mật máy tính người Ba Lan. Joanna Rutkowska đã gây chấn động toàn thế giới khi cô trình diễn hai phương pháp đơn giản để hack vào Windows Vista beta trước đám đông vào tháng 8 năm 2006.

Xem thêm:  Microsoft đã xóa thư mục Download khỏi Disk Cleanup

Cô ấy thuyết trình tại một hội nghị và làm việc với một số hãng công nghiệp khổng lồ bao gồm Microsoft.

Raven Adler

Chà, Raven Adler là người phụ nữ đầu tiên có mặt tại hội nghị hacker của DefCon. Cô ấy hiện đang làm cố vấn bảo mật cấp cao cho một số công ty.

Raven Adler nổi tiếng với việc phát triển các hệ thống phát hiện hack. Cô cũng làm việc với một số công ty nổi tiếng để giúp họ bảo vệ dữ liệu trực tuyến của họ.

Jude Milhon

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

Chà, Jude Milhon bắt đầu sự nghiệp của mình với tư cách là một lập trình viên máy tính vào năm 1967. Tuy nhiên, sau đó cô đã thành lập một nhóm hack được gọi là Cypherpunks.

Trong suốt cuộc đời của mình, cô đã viết một số cuốn sách cũng như xuất bản một số tạp chí liên quan đến hack và lập trình máy tính. Cô qua đời năm 2003.

Natasha Grigori

Danh sách 10 nữ hacker khét tiếng và xinh đẹp nhất thế giới

Natasha Grigori bắt đầu sự nghiệp của mình với tư cách là một hacker. Tuy nhiên, cô ấy không quản lý để đạt được một số danh tiếng. Vào cuối những năm 1990, cô thành lập trang antichildporn.org, nơi cô bắt đầu tán công các website nội dung khiêu dâm trẻ em. Natasha Grigori qua đời vào tháng 11 năm 2005 do bệnh nặng.

Vợ tui

Vâng, bất cứ ai đã lập gia đình đều biết vợ mình có khả năng hack bất cứ Password nào của bạn, từ điện thoại di động, đến laptop, cũng như SMS. Chỉ cần một cái liếc mắt, lập tức Password sẽ được người chồng khai báo, mà người vợ không cần dùng tới chiếc máy tính hay kể cả bàn phím nào. Có thể nói đây là Hacker nguy hiểm nhất mọi thời đại.

Đây là 10 nữ hacker khét tiếng nhất thế giới. Bạn hãy cố gắng phấn đấu để bằng chị em phụ nữ đi nhé, ad đi lau nhà, rửa chén tiếp đây.

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

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

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

Chạy database migration khi deploy, nên hay không?

Chạy database migration khi deploy, nên hay không?

Bài viết được sự cho phép của tác giả Huỳnh Quán Cẩm

Có một thủ pháp thường hay được sử dụng khi deploy app là chạy database migration ngay khi deploy, nhưng liệu đó có phải là một good practice (tam dịch: cách làm tốt) hay không?

Tất nhiên, để đảm bảo tính khách quan, mình giữ lập trường “câu trả lời vẫn luôn là còn tùy”, nhưng 99.9999% trường hợp là KHÔNG.

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

Giả sử ta có một app cần phải đổi tên cột dob của bảng users thành date_of_birth.

Dễ ợt như a ă â đúng không, ta chỉ cần một đoạn code migration như sau.

def change
  rename_column "users", :dob, :date_of_birth
end

Và trong đoạn code trả về cho người dùng.

# trước khi sửa
render_json({id: user.id, date_of_birth: user.dob})

# sau khi sửa
render_json({id: user.id, date_of_birth: user.date_of_birth})

Như đầu đề, ta sẽ chạy migration code cùng lúc với deploy. Có thể nó khá phức tạp tùy theo từng app nhưng chung quy lại gồm 3 bước: a) Kéo code mới từ SCM về b) chạy đoạn code migration ở trên và c) restart lại ứng dụng để áp dụng mã mới.

Vậy thì vấn đề của cách làm trên là ở đâu?

Vấn đề

Có thể bạn sẽ để ý được là ở khoảng thời gian sau b) cho tới khi c) kết thúc, phần API đọc và ghi users của bạn sẽ bị lỗi không ngừng nghỉ với rate là 100%, lý do là vì lúc đó cột dob đã bị gỡ khỏi database nhưng code mới thì chưa được release lên.

Đương nhiên bạn có thể đảo ngược thứ tự giữa b) và c) nhưng vấn đề không đổi, cột date_of_birth chưa được tạo.

Là một lập trình viên, đôi lúc bạn sẽ nghĩ là vài giây đó thì thấm tháp vào đâu, nhưng chắc chắn 99.99% đồng nghiệp của bạn đang làm cho bộ phận tiếp nhận phàn nàn từ khách hàng sẽ nghĩ khác, những phần tử trong 0.001% còn lại (ừ thì 1 + 1 = 3) chắc hết chiều hôm đó thôi việc.

Giải pháp

Không có một giải pháp chuẩn nào cho việc này cả nhưng nói một cách hàn lâm thì quy tắc chung là:

Đảm bảo bản deploy hiện tại tương thích với bản deploy trướcĐỪNG CÓ VĂNG LỖI FFS !!!!! ở bất kì thời điểm nào của deploy.

Vậy với vấn đề ở trên (định dùng chữ bài toán nhưng sợ bạn rule keeper ở #random phàn nàn) cách giải quyết là chia thành nhiều bản deploy nhỏ (chú ý mỗi bước sau đây là một bản deploy).

a) tạo ra cột date_of_birth trong bảng users.

b) sửa đoạn code ghi ngày sinh và đoạn code đọc ngày sinh.

## ghi
User.update(user_id, date_of_birth: params[:dob])

## đọc
user = User.read(user_id)
date_of_birth = user.date_of_birth || user.dob
render_json({id: user.id, date_of_birth: date_of_birth)

c) Viết đoạn script migrate tất cả dữ liệu từ dob qua date_of_birth.

d) Xóa đoạn code đọc đi (đừng xóa đoạn viết nếu bạn không muốn đồng nghiệp quay qua hỏi thăm bằng tiếng Đan Mạch).

e) Tạo migration để xóa cột dob.

Kết luận

Quản lý database schema là một vấn đề khó và đòi hỏi sự cẩn thận, tốt nhất là bạn nên đùn công việc này cho người khác nếu có thể (troll đó cơ mà nếu đùn được thì tốt).

Các bước thực hiện có thể sẽ khác nhau tùy trường hợp nhưng ý tưởng cơ bản thì là như trên, bạn có thể xào nấu lại tùy thích.


Lời cuối: Chúc chúng ta không bị banh server và ngủ ngon mỗi đêm.

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

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

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

Tại sao bạn nên đi làm công ty thay vì làm freelancer

Tại sao bạn nên đi làm công ty thay vì làm freelancer

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

Tình hình hôm vừa rồi có đi cafe với ông Anh, ổng hỏi sao chú không ở nhà làm cho khỏe, làm công ty làm chi cho mệt? WordPress thiếu chi dự án… Đúng là một câu hỏi cũng đáng phải suy nghĩ 🙂 Làm ở nhà thì thời gian thoải mái hơn, tự do, nếu ổn định thì thu nhập cao hơn… Nhưng…

Suy nghĩ thế thôi chứ theo mình đi làm công ty mình được nhiều thứ hơn là tiền… Với hơn 4 năm theo nghiệp code trải qua hơn 4 công ty thì hôm nay mình xin được chia sẽ cho các bạn những lý do bạn nên đi làm công ty thay vì làm ở nhà (freelancer).

Tại sao bạn nên đi làm công ty thay vì làm freelancer

1. Sự ổn định

Cái này thì tất nhiên rồi làm công ty với một mức thu nhập ổn định thì sẽ mang đến cho bạn một sự yên tâm. Hằng tháng cứ đến ngày 5 (Ngày nhận lương của mình =)) )  là tiền tự vào tài khoản, ngày làm đủ 8h tối về chở vợ con đi siêu thị chơi chả lo gì. Còn làm freelancer tháng nào nhiều dự án thì thu nhập được, tháng này bận việc hoặc nhác làm thì tiền chả có, chưa tính đến chuyện khách hàng chơi lầy làm xong rồi mà không chịu trả tiền…

Ổn định ở đây không chỉ ảnh hưởng đến bản thân bạn và còn ảnh hưởng đến người chung quanh… Nếu bạn làm công ty người thân sẽ thấy yên tâm: “à con tui nó làm công ty nước ngoài… Chồng tao làm lead công ty ABC…” Còn nếu bạn làm ở nhà phụ huynh của bạn sẽ cảm thấy khá lo lắng không biết nó làm gì mà ngồi máy tính cả ngày…

2. Đi làm công ty sẽ giúp bạn bớt “hư hỏng” =))

Mình cũng có 1 khoảng thời gian làm ở nhà, cũng tầm 1 tháng. Trong một tháng đó lịch làm việc của mình là: Sáng 11h thức dậy ăn sáng kiêm ăn trưa -> Ngồi máy tính chơi game đến 5h -> Đi ăn tối kiêm đi chơi đến 10h tối về -> Làm việc đến 3h sáng rồi đi ngủ luôn.

Một lịch làm việc chả có cái qq gì là khoa học hết và nó ảnh hưởng trầm trọng đến sức khỏe. Mình nhận ra đây không phải là cuộc sống mình hướng tới, mình không thể control được bản thân khi tự do và không có áp lực :)) Và mình quyết định đi xin việc công ty lại.

Khi đi làm công ty thì mọi chuyện hoàn toàn khác. Tối phải lo ngủ sớm để mai làm cho đúng giờ, xem world cup thì xem tới trận 10h thôi, còn trận 1h sáng mai lên xem video là là oke rồi. Chăm sóc vệ sinh cá nhân tốt hơn, phong cách ăn mặc cũng lịch sự hơn….Vì công ty cũng làm việc tập thể mà, đặc biệt lại có mấy em nữa :)))

3. Làm công ty sẽ giúp skill của bạn tăng lên đáng kể

Làm ở nhà thì tất cả kiến thức hầu như bạn phải tự mày mò, tự tìm tại liệu. Để tìm hiểu một kiến thức nào đó bạn phải tự lên lộ trình học… Nhưng nếu vào công ty thì tất cả bạn sẽ được định hướng cái gì học trước, cái gì học sau nó sẽ giúp bạn tiết kiệm thời gian. Chưa kể một số công ty còn có riêng đội ngũ để train cho nhân viên mới… Có nghĩa bạn sẽ được học mà không bị tốn tiền

Một cái khá quan trong nữa là: Khi bạn viết ra những dòng code sẽ có đi review code cho bạn kaka. Lead hoặc những người có kinh nghiệm sẽ đi review code, chỉnh cho bạn từng dòng, code sao cho hợp lý, code sao cho tối ưu, code sao cho chuẩn… Tất nhiên lúc đầu bạn sẽ nghe chữi khá nhiều, nhưng chỉ cần 1 2 lần review oke thì bạn sẽ rất tự tin với những dòng code mình viết ra cũng nhưng đãm bảo chất lượng cho những dự án sau này….

Làm CNTT quan trọng nhất là thực hành nhiều mới lên trình được… Nếu bạn làm ở cty thì dự án rất nhiều nên bạn có cơ hội để thực hành trên dự án thực tế cao, chỉ cần qua 1 2 dự án thực tế thì bạn đã có kinh nghiệm đầy mình 😀

 4. Có cơ hội được tìm hiểu công nghệ mới

Đa số dự án của công ty là dự án lớn. Những dự án lớn cần sự tối ưu cao thì sẽ sử dụng nhưng công nghệ mới và hiện đại. Nếu làm ở công ty bạn sẽ có nhiều cơ hội tiếp xúc với những công nghệ đó. Điều đó sẽ giúp bạn không bị tụt hậu bạn sẽ thấy có tương lai hơn 😀 Sẽ không có cảm giác nếu ko làm cái này thì không biết làm gì…

5. Nâng cao khả năng làm việc nhóm

Tại sao bạn nên đi làm công ty thay vì làm freelancer

Cái này thì hiển nhiên rồi, làm công ty chủ yếu là làm việc theo nhóm. Làm việc theo nhóm giúp bạn học hỏi dược cách phần chia công việc, học được cách phối hơn cùng đồng đội, nâng cao tình thần trách nhiệm của mỗi cá nhân. Bạn sẽ học được cách sử dụng các công cụ quản lý code theo phiên bản như git, svn …

5. Nâng cao khả năng chịu đựng =))

Công ty nào cũng có nội quy, quy định. Mình đã từng làm công ty có những quy định rất khắc nghiệt ví dụ như:

  • Đi làm phải cực kỳ đúng giờ – Đi chậm 10 phút là lên họp với sếp. Đi làm trễ là thấy sếp đang ngồi chổ làm việc của mình :)))
  • Trong lúc làm việc ko được để chuông điện thoại reo – Nếu để chuông reo là hàng trăm đôi mắt nhìn về mình.
  • Trong lúc làm việc ko được ra ngoài chỉ có giờ giải lao giữa giờ mới ra ngoài =)))
  • Tuyệt đối không được lượt facebook trong lúc làm việc – Nhớ đợt đó đang làm mình lướt fb mà lão sếp đứng sau lưng lúc nào ko biết =)) thế là mấy ngày sau lão cứ lượn sau lưng mình =))) Bạn có hiểu cảm giác làm việc mà có người đứng sau lưng mình xem ko =))

Làm việc trong môi trường như thế chắc bạn sẽ thấy khá là hãm :)). Có chi được đâu mà khỏe, nhưng nếu bạn nghĩ theo một hướng tích cực thì sẽ thấy nó cũng giúp được mình khác nhiều.

Trải qua những quy định khắc nghiệt như thế thì mình sẽ học được sự chuyên nghiệp, tập trung trong công việc… Đồng thời sau này có đi công ty khác thì cũng không thấy khó khăn gì vì mình đã từng làm trong môi trường kinh khủng hơn thế 😀

6. Là hành trang cần thiết để sau này bạn làm startup hihi 😀

Tại sao bạn nên đi làm công ty thay vì làm freelancer

Làm công ty bạn sẽ học được cách vận hành một bộ máy lớn, cách quản lý dự án, cách quản lý nhân sự, cách xử lý các vấn đề bất cập… Hay là cách ứng xử giữa sếp với nhân viên. Từ đó bạn sẽ có chút ít kinh nghiệm để sau này mở công ty hoặc làm startup.

Tóm lại:

Nếu bạn là sinh viên mới ra trường thì mình khuyên nên xin vào một công ty, đây là cách nhanh nhất để bạn có kinh nghiệm. Nếu ko xin được vào làm, thì có thể xin thực tập và học việc. Đa số công ty hiện tại cũng muốn đào tạo mấy bạn thực tập để vào làm luôn.

Những cái list đầu dòng phía trên chỉ là cảm nhận cá nhân mình nhé. Và tất nhiên cũng tùy theo công ty, không phải công ty nào bạn cũng được hưởng những quyền lợi như trên 😀

Trên đây chỉ là tâm sự của một thằng ngày code công ty tối về code cho vợ :)))

Chào thân ái và quyết thắng!!!

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

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

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

Bỏ túi cheatsheet dành cho Python newbie

Python cheat sheet

Một bài viết ngắn tổng hợp các lệnh Python cơ bản nhất cho lập trình viên mới bắt đầu với Python. Cùng TopDev xem qua và lưu về cheatsheet Python này nhé.

Biến – Variables

Biến trong Python được tạo và hiển thị như sau: name = expression.

num = 11 # hiển thị 11
word = "Hello" # hiển thị "Hello"
logic = True # hiển thị True
my_list = [2, 3, 4] # hiển thị [2, 3, 4]
my_tuple = (5, 2) # hiển thị (5, 2)
my_dict = {} # hiển thị {}
my_set = {4, 5} # hiển thị {4, 5}

Chuỗi – Strings

Chuỗi trong Python là tập hợp các ký tự và có thể khai báo bởi dấu nháy đơn ‘ hay dấu nháy đôi “

name = "Jeremy" # hiển thị "Jeremy"
size = len(name) # hiển thị độ dài 6 ký tự của chuỗi
twice = name * 2 # hiển thị "JeremyJeremy"
concat = name + "'s" # hiển thị "Jeremy's"
check = "e" in name # hiển thị True
first = name[0] # hiển thị "J"
last = name[-1] # hiển thị "y"
subset = name[1:4] # hiển thị "ere"
lower = name.lower() # hiển thị "jeremy"
upper = name.upper() # hiển thị "JEREMY"

Toán tử số học – Arithmetic

Toán số có thể sử dụng các ký tự: +, -, /, //, *, **, và %.

add = 3 + 7 # hiển thị tổng là 10
sub = 5 - 3 # hiển thị hiệu là 2
mul = 3 * 3 # hiển thị tích là 9
div = 5 / 2 # hiển thị thương là of 2.5
idiv = 5 // 2 # hiển thị kết quả là 2
exp = 2 ** 4 # hiển thị 16
rem = 7 % 2 # hiển thị 1
paren = (3 + 2) / 5 # hiển thị 1.0

Toán tử quan hệ – Relational Operators

Phép so sánh có thể sử dụng: >, >=, ==, <=, và <.

less = 2 < 4 # hiển thị True
less_equals = 3 <= 3 # hiển thị True
equals = 4 == 7 # hiển thị False
greater_equals = 5 >= 2 # hiển thị True
greater = -4 > 5 # hiển thị False

Kiểu dữ liệu Boolean – Boolean Algebra

Hoàn thành câu lệnh Boolean với các keywords: and, or, và not

 is_cold = True # hiển thị True
 is_wet = True # hiển thị True
 is_not_cold = not is_cold # hiển thị False
 am_sad = is_cold and is_wet # hiển thị True
 am_mad = is_cold or is_wet # hiển thị True
  11 tip học Python dành cho các “newbie”
  71 trích đoạn code Python cho các vấn đề hàng ngày của bạn

Kiểu dữ liệu từ điển – Dictionaries

Dictionaries bao gồm các key và value, sử dụng cặp dấu ngoặc nhọn {} để khai báo:

my_map = {"x": 2} # hiển thị {"x": 2}
value = my_map["x"] # hiển thị 2
my_map["y"] = 5 # adds "y": 5 to dict
list(my_map.keys()) # trả về [x, y]
list(my_map.values()) # trả về [2, 5]

Danh sách – List

List trong Python cho phép lưu nhiều kiểu data, và sử dụng cặp dấu ngoặc vuông [] để khởi tạo list.

 items = [1, 2, 3] # hiển thị [1, 2, 3]
 length = len(items) # hiển thị 3
 begin = items[0] # hiển thị 1
 end = items[-1] # hiển thị 3
 section = items[0:1] # hiển thị [1]
 exists = 2 in items # hiển thị True
 items.append(4) # adds 4 to end of list
 items.extend([5, 6]) # appends 5 and 6
 items.reverse() # đảo ngược thứ tự của list
 items.clear() # làm trống list

Vòng lặp – Loops

Để lặp lại 1 section code, Python sẽ dùng cả vòng lặp whilefor.

# prints "h\ni\n"
greet = "hi"
index = 0
while index < len(greet):
 print(greet[index])
 index += 1
#cùng code, nhưng lặp for
for index in range(len(greet)):
 print(greet[index])
#cùng code, nhưng lặp for each
for char in greet:
 print(char)

Điều kiện – Conditionals

Với Python, conditions sử dịng cú pháp if/elif/else.

 # prints "Nice car!"
 cars = ["Tesla", "Ford", "Toyota"]
if "Toyota" in cars:
 print("Nice car!")
elif "Audi" in cars:
 print("Not bad!")
else:
 print("Mistakes were made.") 

Ngoài ra còn có thể chèn if trong if

# removes "Toyota" from cars
# prints "We won't be needing that!"
if "Toyota" in cars:
  if "Tesla" in cars:
    cars.remove("Toyota")
    print("We won't be needing that!"

Bao hàm – Comprehensions

Comprehension được coi là hàm kết hợp giữa list và dictionaries

# tạo list từ 0 đến 49
nums = [x for x in range(50)]
# tạo list các số nhân đôi
doubles = [x * 2 for x in nums]
# tạo list các số chẵn
evens = [x for x in nums if x % 2 == 0]
# tạo mapping cho số chẵn
map = {x: y for x, y in zip(nums, evens)}

TopDev tổng hợp

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

Xem thêm công việc Python lương cao, phúc lợi tốt tại TopDev

Tìm hiểu về Webpack và Create React App

Tìm hiểu về Webpack và Create React App

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

Khi làm việc với ReactJS, chúng ta đã nghe khá nhiều về 2 cái tên Webpack với Create React App. Vậy Webpack với Create React App khác nhau như thế nào? Chúng ta sẽ cùng nhau tìm hiểu ở bài viết này nhé.

Webpack với mục đích chung nhất là để đóng gói, nó dùng để chuyển đổi code React + ES6 sang Javascript thuần (plan-vanilla JS), nó cực kỳ hữu ích và mềm dẻo, nó có thể được cấu hình để bao gồm những thứ mà khi xây dựng một ứng dụng React có thể cần, nhưng nó tốn nhiều thời gian để developer hiểu và cấu hình thiết lập. Webpack cũng hoạt động tốt với Angular, Vue, NodeJS và kể cả là Web Assembly.

Vì lý do trên, mà Facebook đã tạo ra Create React App, chứa Webpack ở bên  trong. Mọi thứ đã được cấu hình sẵn, developer chỉ cần tập trung vào việc code, chứ không phải việc ngồi cấu hình cho dự án. Nhưng với Create React App, để cấu hình một cách linh hoạt như Webpack thì đó là một điệu cực kỳ khó khăn.

Bên dưới đây, là một số so sánh cụ thể hơn nữa về Create React App Và Webpack.

Tuyển dụng lập trình React các công ty HOT

Mô-đun và Npm package

Để dễ hiểu thì npm package là một thư mục hoặc một file có chứa hoặc sử dụng nhiều mô-đun.

Các bạn có thể tham khảo link này để biết sự khác biệt giữa mô-đun và npm package:

https://docs.npmjs.com/about-packages-and-modules

Webpack là một mô-đun đóng gói trong khi react-script là một npm package, nó chứa các dependency (gói thư viện) cần để khởi tạo nhanh một project ReactJS như “babel” và “webpack” cũng có trong danh sách các dependency của react-script.

Môi trường

Create React App không có file build cấu hình vì thế chúng ta không thể cấu hình cho nó. Nếu bạn muốn điều chỉnh một số thứ bạn phải sử dụng đến lệnh “npm run eject” để nó xuất ra cho bạn các file cấu hình để bạn điều chỉnh. Mà bạn biết rồi đấy code hay cấu hình của một ai đó sẽ khiến bạn khó hiểu và bối rối mỗi khi xem chúng.

Với Webpack bạn có toàn quyền cấu hình môi trường phát triển cho dự án của bạn, và cấu hình theo cái mà bạn mong muốn.

Server Side Rendering

Để cấu hình và thiết lập SSR với Create React App thì rất đau đầu, với Webpack thì mọi chuyện sẽ dễ dàng hơn.

  10 Java Web Framework tốt nhất

  10 trang web hàng đầu để tìm hiểu WordPress

Bảo trì dự án

Trong khi sử dụng Webpack, thì bạn sẽ hoàn toàn dễ dàng, thoải mái chỉnh sửa cấu hình của Webpack, khi có sự thay đổi hoặc bạn muốn nâng cấp dự án.

Với Create React App thì tất cả được quản lý bởi cộng đồng React.

Tổng kết

Create React App phù hợp nhất cho các dự án nhỏ, nó không phù hợp cho các dự án lớn và phức tạp.

Sử dụng Create React App, sẽ tiết kiệm được thời gian khởi tạo và thiết lập dự án cho các bạn mới học React. Các bạn có thể tập trung vào học cách code React mà không cần lo lắng hay quan tâm “babel” là gì hay các thiết lập phức tạp khác trong file cấu hình Webpack.

Kiến thức về Webpack như là một kỹ năng cần có.

Tham khảo:

  1. https://medium.com/@imbudhiraja/webpack-vs-create-react-app-cb72c47f8100
  2. https://stackoverflow.com/questions/52177318/webpack-build-vs-react-scripts-build

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

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

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

Chat app đơn giản với Flutter

Chat app đơn giản với Flutter

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

Trong bài viết này, mình sẽ chia sẻ đến các bạn một project nho nhỏ: Chat app đơn giản với Flutter. Mình sẽ tạo một chat app trên mobile, sử dụng Flutter framework, Firebase Authentication và Cloud Firestore.

  Biết chọn gì đây? Flutter, React Native hay Xamarin?
  Flutter Vs. React Native - Nên chọn framework nào?

Demo

Vì đây chỉ là một project nhỏ thôi nên tính năng của nó không có gì đặc biệt cả. Chat app của mình sẽ có tính năng sign in, sign up và chat, dĩ nhiên rồi.

Chat app đơn giản với Flutter
Sign up screen
Chat app đơn giản với Flutter
Chat screen
Demo Chat App

Trước hết thì mình cần phải thêm firebase vào project flutter của mình. Sau đó thêm các plugin firebase_corefirebase_auth và cloud_firestore

Sign in screen

Chức năng đăng nhập thì để đơn giản, mình chỉ sử dụng phương thức đăng nhập bằng Email/Password của Firebase Authentication. Đương nhiên là bạn có thể thêm các phương thức khác như Sign in with GoogleFacebook

Screen này sẽ được gọi đầu tiên nên mình sẽ check xem user đã sign in hay chưa, nếu rồi thì replace bằng chat screen.

Screen của mình chỉ có 2 TextField để nhập email và password, một Button sign in (thực hiện chức năng sign in) và một Button sign up (chuyển qua sign up screen).

Sign up screen

Sign up screen cũng đơn giản, mình sẽ có các TextField để nhập email, display name, password và confirm password, một Button sign up (thực hiện sign up, sau khi sign up xong thì chuyển qua chat screen).

Để dễ dàng quản lý hơn thì các phương thức sign in và sign up mình để chung trong class AuthService.

Chat screen

Cũng để dễ dàng quản lý, mình tạo một class MessageService chứa các phương thức static để send message và get message stream.

Mình build một cái message composer ở phía bên dưới cùng, nhấn vào icon send thì tin nhắn sẽ được gửi. Phần lớn phía bên trên là một StreamBuilder, với stream là message stream từ MessageService, builder sẽ return về một ListView.

Để cho nó có chút logic thì mình kiểm tra và thay đổi vị trí và màu sắc của các tin nhắn được gửi bởi người khác và người hiện tại sẽ khác nhau.

Lời kết

Hi vọng là các bạn sẽ thấy thích project nhỏ của mình, các bạn có thể xem source code đầy đủ tại đây. Nếu các bạn thấy bài viết này hay, đừng quên chia sẻ cho bạn bè cùng biết nha. Cảm ơn các bạn!

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

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

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

Micro frontend tại sao và như thế nào?

Micro frontend tại sao và như thế nào

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

Tại sao bạn cần biết đến Micro frontend

Vấn đề cần giải quyết:

  • Ứng dụng càng lúc càng phình ra về quy mô, cũng như độ phức tạp
  • Một codebase FE duy nhất mà muốn maintain thì chỉ có gặp ác mộng hằng đêm
  • Bạn có nhiều team FE khác nhau, mỗi team chỉ làm việc chính trên một phần tính năng nào đó rất cụ thể, chỉ 1 codebase mà hơn 5 team vào làm việc trên đó thì thôi xong
  • Bạn muốn có 1 codebase viết bằng typescript, một codebase viết js, một feature được build bằng React, feature khác được build Vue

Micro frontend là cái gì

Đây là cách tiếp cận cũng na ná như microservice, thay vì 1, chúng ta có nhiều codebase, và trên từng codebase chỉ quản lý một tính năng cụ thể mà thôi.

Có thể xem một ứng dụng web là một bộ kết hợp của nhiều tính năng, mỗi một tính năng như vậy được quản lý bởi một team

Micro frontend tại sao và như thế nào?

Thuật ngữ này được giới thiệu lần đầu vào 2016 bởi Thourghtworks Tech Radar

An architectural style where independently deliverable frontend applications are composed into a greater whole

Micro frontend tại sao và như thế nào?

Một cách trực quan hơn bạn có thể tham khảo hình sau

Micro frontend tại sao và như thế nào?

Còn đây là demo của trang microfrontends.com https://demo.microfrontends.com/

Nhiều công ty tuyển dụng Frontend Developer đãi ngộ tốt, ứng tuyển ngay!

Hiện thực hóa như thế nào?

Để có thể hiện thực hóa hoàn chỉnh micro frontend sẽ bao gồm rất nhiều thứ, ở đây chỉ tóm tắt một số vấn đề cơ bản cần giải quyết

Tương tác giữa các ứng dụng

Một câu hỏi được đặt ra đầu tiên là nếu tách ra thành nhiều bộ source như vậy, làm sao chúng có thể nói chuyện được với nhau? Một cách tổng quát, nên hạn chế việc trao đổi thông tin qua lại ít chừng nào tốt chừng đó, bởi vì nếu bạn làm ngược lại, nghĩa là bạn đang lặp lại vấn đề chúng ta muốn giải quyết ngay từ đâu: decoupling các tính năng với nhau.

Nhưng việc trao đổi giữa các ứng dụng với nhau là không tránh khỏi và cần thiết, chúng ta chỉ tiết chế chứ không loại bỏ hết, Custom event là một cách, cách khác, lấy mô hình truyền callback và data từ trên xuống trong React để làm kênh trao đổi thông tin, làm như thế nó sẽ rất tường minh, cách thứ 3 là thông qua thanh đường dẫn trên trình duyệt, chút nữa nói kỹ hơn.

Tựa chung, chúng ta không share state, mà chỉ share dữ liệu trong database như microservice.

Thư viện component dùng chung

Nó chung, ý tưởng re-use lại những component UI không có gì mới, nghe cũng rất hợp lý, mặc dù ai cũng biết việc đó khó làm.

Sai lầm thường thấy là việc tạo các component như vậy quá sớm, việc hào hứng quá mức vào xây dựng một Framework UI chuẩn không cần chỉnh, viết một lần xài mãi mãi, thống nhất giao diện trên mọi mặt trận là điều thường thấy ở mọi team. Tuy nhiên, trong thực tế, kinh nghiệm cho biết rằng việc đó rất khó, nếu không muốn nói là không thể, không thể ngồi nghĩ ra một bộ Framework với tất cả các API cần thiết rồi đưa cho tất cả các team xài, chắc gì API đó đã đáp ứng đúng nhu cầu cho tất cả các team? Lời khuyên là các team cứ tạo ra những component riêng trong codebase nếu họ thấy cần, dù cho nó có bị duplicate đây nữa cũng chẳng sao. Và khi đã chín mùi, những API nào cần thiết sẽ hiện nguyên hình, chúng ta đưa những cho đang bị duplicate vào trong thư viện dùng chung.

Tất nhiên cũng có những ngoại lệ, những component mà nhìn vào chúng ta biết ngay là cần đưa vào share component, như icon, label, button, autocomplete, drop-down, search, table. Và nhớ là chỉ đưa đúng UI logic, đừng đưa bất kỳ business logic và domain logic vào đây. Ví dụ như một component ProductTable cho riêng cái domain Product là không nên, chỉ nên làm một cái component Table.

Thoạt nghe làm một share component có vẻ đơn giản, nhưng nó lại là công việc đòi hỏi kỹ thuật phải rất cứng tay, và người có nhúng tay vào tất cả các team.

  Fluent Design – Ngôn Ngữ Thiết Kế Mới Của Microsoft
  9 dự án mới nhất giúp bạn thành trùm Frontend trong năm 2024

Styling

Styling 2020 là một câu chuyện dài, như mình đã kể trong một bài viết, tựa chung mà nói bạn có thể dùng BEM, dùng SASS, dùng CSS module, dùng CSS-in-JS, dùng Styled Component, dùng Tailwind, kiểu gì cũng được, miễn đảm bảo được style không chồng chéo lên nhau, thằng nào độc lập thằng đó, và tự tin đoạn code nó sẽ chạy như đúng như lường trước.

Các cách để integrate

Để hiện thực hóa ý tưởng của micro frontend, cũng có nhiều cách làm, cách nào cũng có đánh đổi. Tựu chung, nếu xét theo hướng giao diện, chúng ta có thể tổ chức nó theo dạng một ứng dụng dạng container, bao gồm những thành phần chung như headermenu, và các micro frontend sẽ nhúng vào phần ruột của trang

Micro frontend tại sao và như thế nào?

Cách 1: composition dùng server side template

Với một cách không chính thống lắm cho việc phát triển code FE, chúng ta render HTML ở phía server, với nhiều bộ template khác nhau. Chúng ta có một file index.html với các phần tử chung, server sẽ quyết định phần ruột trả về cho từng trang

<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Feed me</title>
  </head>
  <body>
    <h1> Feed me</h1>
    <!--# include file="$PAGE.html" -->
  </body>
</html>

Ở ví dụ này đang dùng với Nginx, biến $PAGE sẽ ứng với URL đang được request

server {
    listen 8080;
    server_name localhost;

    root /usr/share/nginx/html;
    index index.html;
    ssi on;

    # Redirect / đến /browse
    rewrite ^/$ http://localhost:8080/browse redirect;

    # Dùng HTML nào để insert dựa vào URL
    location /browse {
      set $PAGE 'browse';
    }
    location /order {
      set $PAGE 'order';
    }
    location /profile {
      set $PAGE 'profile'
    }

    # Cho phép render ở index.html
    error_page 404 /index.html;
}

Kỹ thuật này mình không nắm lắm, nên cũng chỉ để đây cho các bạn tham khảo, trong thực tế mình gặp và làm việc với những cách làm bên dưới nhiều hơn.

Integrate lúc build

Cách này sẽ publish cái micro frontend ở dạng package, container sẽ khai báo những micro frontend này ở dạng dependency. File package.json nó sẽ trông như thế này:

{
  "name": "@feed-me/container",
  "version": "1.0.0",
  "description": "A food delivery web app",
  "dependencies": {
    "@feed-me/browse-restaurants": "^1.2.3",
    "@feed-me/order-food": "^4.5.6",
    "@feed-me/user-profile": "^7.8.9"
  }
}

Thoạt nhìn, cũng khá hợp lý, tuy nhiên nếu để ý, bạn sẽ thấy chúng ta phải re-compile và release trên từng cục dependency, rồi sao đó lại phải release tiếp container. Đây vẫn không phải là cách làm được khuyến khích.

Integrate lúc run-time bằng iframe

Đây cũng là cách mà dự án mình đang dùng, một cách tiếp cận đơn giản nhất để compose nhiều ứng dụng với nhau trong trình duyệt đã có từ rất rất lâu. Lợi ích có thể kể thêm của cách làm này là phần styling và biến global đều độc lập và không bị đụng độ lẫn nhau

<html>
  <head>
    <title>Feed me!</title>
  </head>
  <body>
    <h1>Welcome to Feed me!</h1>

    <iframe id="micro-frontend-container"></iframe>

    <script type="text/javascript">
      const microFrontendsByRoute = {
        '/': 'https://browse.example.com/index.html',
        '/order-food': 'https://order.example.com/index.html',
        '/user-profile': 'https://profile.example.com/index.html',
      };

      const iframe = document.getElementById('micro-frontend-container');
      iframe.src = microFrontendsByRoute[window.location.pathname];
    </script>
  </body>
</html>

Nhược điểm của cách này là việc tích hợp giữa các phần của ứng dụng, như route, history, deep-link sẽ rất phức tạp, responsive cũng sẽ gặp nhiều vấn đề cần xử lý hơn.

Integrate lúc run-time bằng JavaScript

Đây là cách linh hoạt nhất, và được nhiều team chọn làm. Mỗi một micro frontend sẽ được nhét vào trong trang bằng thẻ <script />. Container sẽ làm nhiệm vụ cho mount micro frontend nào và thực thi các hàm liên quan để báo cho các micro frontend sẽ render ở đâu và khi nào.

<html>
  <head>
    <title>Feed me!</title>
  </head>
  <body>
    <h1>Welcome to Feed me!</h1>

    <!-- Nó không render bất cứ gì cả -->
    <!-- Nó sẽ đưa vào hàm entry-point vào `window` -->
    <script src="https://browse.example.com/bundle.js"></script>
    <script src="https://order.example.com/bundle.js"></script>
    <script src="https://profile.example.com/bundle.js"></script>

    <div id="micro-frontend-root"></div>

    <script type="text/javascript">
      // Những global function này được nhét vào window bằng các đoạn script include ở trên
      const microFrontendsByRoute = {
        '/': window.renderBrowseRestaurants,
        '/order-food': window.renderOrderFood,
        '/user-profile': window.renderUserProfile,
      };
      const renderFunction = microFrontendsByRoute[window.location.pathname];

      // Sau khi đã có các hàm cần thiết,
      // đưa id của element sẽ dùng để render
      renderFunction('micro-frontend-root');
    </script>
  </body>
</html>

Trên đây chỉ là ví dụ cơ bản nhất để mô tả kỹ thuật sẽ làm, thật tế có thể phải thêm thắt một số thứ khác. Không giống với cách integrate lúc build, bundle.js có thể được deploy một cách độc lập. Và khác iframe, chúng ta có thể linh động chọn lựa việc render micro frontend nào chúng ta thích.

Nếu có hứng thú với cách làm này, có thể tham khảo thêm ví dụ chi tiết hơn

Integrate lúc run-time bằng Web Component

Một lựa chọn khác cũng tương tự như cách làm trên, mỗi một micro frontend sẽ được link với element

<html>
  <head>
    <title>Feed me!</title>
  </head>
  <body>
    <h1>Welcome to Feed me!</h1>

    <!-- Chưa render gì cả -->
    <script src="https://browse.example.com/bundle.js"></script>
    <script src="https://order.example.com/bundle.js"></script>
    <script src="https://profile.example.com/bundle.js"></script>

    <div id="micro-frontend-root"></div>

    <script type="text/javascript">
      // Những element type này được định nghĩa ở các script trên
      const webComponentsByRoute = {
        '/': 'micro-frontend-browse-restaurants',
        '/order-food': 'micro-frontend-order-food',
        '/user-profile': 'micro-frontend-user-profile',
      };
      const webComponentType = webComponentsByRoute[window.location.pathname];

      // Tạo instance và đưa vào document ứng với từng loại phù hợp
      const root = document.getElementById('micro-frontend-root');
      const webComponent = document.createElement(webComponentType);
      root.appendChild(webComponent);
    </script>
  </body>
</html>

Khác nhau duy nhất so với cách trên có lẽ chỉ là việc dùng web component thay vì một interface chúng ta tự định nghĩa.

Trao đổi giữa Backend

Cái này chưa biết, không dám chém.

Kết

Micro frontend có thể không lạ với một số người và khá mới với số còn lại, thực tế mà nói đã có rất nhiều dự án đang áp dụng kiến trúc này (dự án mình đang làm).

Cùng hy vọng với bài viết này bạn đã thấy công việc của những lập trình viên frontend không còn đơn thuần là việc làm sao cho trang web bay, lượn, responsive mượt mà, nếu bạn muốn tiến xa hơn, giới hạn là chân trời.

Các bài viết đã tham khảo

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

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

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

Junior là gì? Yếu tố để cạnh tranh trong “cuộc chơi tuyển dụng”?

Junior là gì

Cuộc chơi tuyển dụng đã không còn là còn là sự cạnh tranh ngầm giữa những nhà tuyển dụng. Trong thời đại 4.0, các ứng viên cần nắm bắt được đâu là đâu là điều mà các nhà tuyển dụng tìm kiếm. Junior – một thuật ngữ chuyên ngành mô tả những ứng viên tiềm năng trong từng lĩnh vực tương ứng đã ra đời.

Vậy Junior là gì? Những tố chất nào một Junior cần sở hữu để tạo ra lợi thế trong hành trình tìm việc? Cùng TopDev theo dõi bài viết sau để thấy rõ những vấn đề được đề cập.

Junior là gì?

Tương tư như Senior, Internship hay Fresher, Junior là thuật ngữ được sử dụng để phân chia trình độ trên cơ sở thời gian, kinh nghiệm làm việc. Chúng đều là những thuật ngữ đã được quy ước trong giới hạn phạm vi doanh nghiệp; một ngành nghề hoặc một lĩnh vực nào đó.

  Junior developer là gì? Những quy tắc bất biến giành cho Junior developer
Junior là gì
Junior là gì?

Cụ thể, Junior là những người mới vào nghề, có ít kinh nghiệm hơn. Họ thường được phân công giải quyết những vấn đề khá đơn giản, không đòi hỏi quá nhiều về chuyên môn. Đối với một số nhiệm vụ (task) phức tạp, họ cần sự hỗ trợ từ những người có kinh nghiêm hơn.

Hãy bắt đầu từ một Junior! Đó là cách tốt nhất để bạn hoàn thiện bản thân từng ngày. Vì điều quan trọng nhất đối với một Junior chính là sự trải nghiệm và học hỏi.

Trong lĩnh vực IT, một Junior Developer là những newbie về công nghệ. Hoặc họ chỉ biết những khía cạnh đơn giản dựa trên nền tảng lý thuyết. Và khi nhìn nhận về góc độ ứng dụng thực tế, họ chưa có nhiều trải nghiệm. Việc của họ trong giai đoạn đầu là học thêm về công nghệ, tìm hiểu về các cấu trúc dự án; rèn luyện và hoàn thiện kỹ năng code từ các senior.

Những yếu tố giúp Junior cạnh tranh trong “cuộc chơi tuyển dụng”

Rất nhiều yếu tố có thể chi phối đến bản thân mỗi Junior. Trong giời hạn bài viết TopDev chỉ ra 2 yếu tố nổi bật sau đây:

Khả năng học hỏi và sự thích ứng

Đối với nhà tuyển dụng, điều họ cần tìm kiếm ở ứng viên Junior là khả năng học hỏi các kiến thức. Đồng thời, sự thích ứng ở một môi trường mới cũng là một yếu tố rất được quan tâm. Nó là cơ sở thúc đẩy Junior tự phấn đấu, trở thành phiên bản tốt hơn mỗi ngày. 

Khả năng học hỏi có thể hiểu là cách ứng viên sẵn sàng tiếp nhận các kiến thức; tự trang bị những kỹ năng cần thiết liên quan đến vị trí Junior tương ứng ngành nghề thuộc nhóm lĩnh vực mình theo đuổi. Cùng với đó, khả năng thích ứng không đơn thuần là linh động làm việc với môi trường, bạn cần phải rèn luyện các kỹ năng khác như: giao tiếp, thiết lập mối quan hệ (networking), làm việc nhóm (teamwork),…

Junior là gì

Chẳng hạn, bạn là một ứng viên ứng tuyển cho vị trí Junior Developer. Kiến thức chuyên môn là điều đầu tiên bạn cần có. Đừng phô bày thành thích qua điểm số! Nhà tuyển dụng chỉ xem xét bạn giải quyết những vấn đề đơn giản hay không. Tiếp theo là phải biết viết code và tối thiểu, code chạy thành công. Kỹ năng quản lý và xử lý – fix bug nhỏ cũng là một kỹ năng cần thiết.

Tất nhiên, nhà tuyển dụng sẽ có những đánh giá chính xác hơn về kiến thức chuyên môn, kỹ năng mềm lẫn tiềm năng phát triển của bạn thông qua buổi phỏng vấn. Nếu may mắn được chọn, hãy chắc chắn rằng bạn có trách nhiệm với công việc.

  Senior là gì? Phân biệt Senior và Junior thật chi tiết

Xây dựng hình ảnh thương hiệu tốt thông qua CV

Trước khi có cơ hội trải nghiệm phỏng vấn, liệu bạn đã biết cách tạo thu hút thông qua CV chưa? 

CV là tấm vé giúp bạn đến gần hơn với nhà tuyển dụng. Do vậy, hãy dành thời gian để đầu tư cho nó. Một chiếc CV chỉn chu, đảm bảo đúng nội dung lẫn hình thức visual sẽ tạo ra thiện cảm đặc biệt.

Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.

Tạo CV chuẩn dành cho IT ngay tại TopDevJunior là gì

Qua CV, nhà tuyển dụng cũng đánh giá được một phần ứng viên:

1. Kỹ năng trình bàyviết CV của bạn có tốt hay không? Bạn đã thật sự quan tâm đến việc tạo dấu ấn cá nhân? Từ cơ sở này, họ sẽ đánh giá sơ bộ về khả năng làm việc, tính trách nhiệm của bạn với công việc.

2. Mục tiêu nghề nghiệp, kỹ năng – kinh nghiệm, cá tính riêng. Bạn đã thể hiện mình vừa đủ hay quá mức? Khó có thể nhìn nhận khả năng thật sự của một ứng viên thông qua CV. Nhưng cách bạn trình bày, sắp xếp nội dung và tổ chức bố cục sẽ thể hiện tất cả. 

Tăng hiệu quả ứng tuyển bằng cách tạo CV Online hiệu quả trên TopDev

Lời kết

Hãy tìm hiểu và trang bị cách thức viết CV đúng chuẩn. CV cần thể hiện chân thật những gì bạn có. Có rất nhiều tip về việc viết CV, điều quan trọng là bạn nên thông mình trong việc lựa chọn thông tin phù hợp. Điều này sẽ phản ánh các kỹ năng chọn lọc, phân tích và trình bày vấn đề của bạn.

Hãy nhớ, mọi thứ bạn thực hiện đều có những ý nghĩa riêng tác động đến kết quả ứng tuyển.

Junior là vị trí có phạm vi tuyển dụng rộng lớn. Nếu là một sinh viên ra trường, bạn không sợ không tìm kiếm được việc. Nếu là những người có trải nghiệm lâu năm và muốn nhảy việc, ít ra bạn vẫn tự tin vì các lợi thế sẵn có. Điều quan trọng là bạn có nhận ra được những gì mình còn thiếu sót hay không? Từ đó, thiết lập kế hoạch rèn luyện mình.

TopDev hy vọng bài viết đã có những phân tích cụ thể, giúp bạn đọc hiểu được khái niệm Junior là gì và nắm bắt được đâu là những yếu tố nổi bật giúp một Junior đủ sức cạnh tranh trên một sân chơi nghề nghiệp. Dù bạn ứng tuyển trong lĩnh vực nào, hãy chuẩn bị thật kỹ lưỡng các kỹ năng tương ứng. Chúc các bạn thành công!

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

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

Cân bằng công việc chính với dự án ngoài liệu có khó không?

Làm sao để cân bằng giữa công việc chính với các dự án ngoài?

Tác giả: Catalin Pit

Khi đang có một công việc toàn thời gian bạn khó có thể dành quá nhiều thời gian cho các dự án ngoài. Mình cố gắng duy trì các tài khoản mạng xã hội luôn active, dành thời gian  viết blog và thỉnh thoảng đăng tải các video lên YouTube nữa. Vậy nên đã có nhiều người hỏi rằng làm thế nào mình cân bằng được mọi thứ như thế?

  10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết

  20 trường hợp sử dụng lệnh Docker cho developer

Trước và sau giờ làm việc hành chính

Để bắt kịp mọi thứ, mình tranh thủ dậy sớm, chẳng hạn nếu bắt đầu làm việc lúc 9 giờ sáng, mình sẽ thức dậy lúc 6 giờ 45. Khoảng thời gian 2 tiếng dư ra trước giờ đi làm mình có thể làm thêm các việc khác. Đương nhiên là lịch trình này không cố định mà phụ thuộc vào nhiều yếu tố khác. Nhưng mình luôn cố gắng làm việc ít nhất 1 đến 2 tiếng trước khi đi làm, vì buổi sáng là lúc mình tràn đầy năng lượng nhất.

Làm sao để cân bằng giữa công việc chính với các dự án ngoài?

Vậy mình làm gì trong khoảng thời gian đó? Mình bắt đầu bằng việc kiểm tra thông báo trên các tài khoản mạng xã hội và lên lịch sẵn cho các nội dung trong ngày. Sau đó, dành toàn bộ thời gian còn lại để học thi chứng chỉ AWS – Amazon Web Services. Mất khoảng 1 tiếng rưỡi để mình tìm hiểu về các service mới cũng như thực hành một số bài tập của AWS. Sau khoảng thời gian này mình sẽ dành 8 tiếng cho công việc chính ở công ty.

Xem thêm Chuỗi chuyên đề độc quyền về Serverless từ Amazon Web Services

Khi có nhiều năng lượng hơn bình thường hoặc có thời gian rảnh rỗi, mình sẽ làm thêm các dự án phụ – side project bên ngoài sau giờ làm việc, nhưng thường giới hạn thời gian tối đa để làm là 1 tiếng. Sau khi đã làm việc 8 tiếng, mình cũng không cố quá để học thêm kiến thức gì mới, vì lúc này đã khá đuối sức và năng lực tập trung không còn nhiều nữa. Khi dành thời gian cho các dự án phụ sau giờ làm, chủ yếu là mình xây dựng nội dung cho cả mạng xã hội, blog và video YouTube vì nó giúp mình cảm thấy thư giãn hơn.

Lên lịch cho nội dung

Khi làm việc ở công ty bạn không thể lên nội dung hay online thường xuyên trên mạng xã hội, vậy nên mình phải lên lịch cho nội dung trước trong ngày. Với các bài đăng trên mạng xã hội thì mình hay tranh thủ những lúc nghỉ ngơi để post bài.

Riêng với blog và video YouTube mình phải dành nhiều thời gian hơn để nghiên cứu và sáng tạo nội dung sao cho hấp dẫn nhất, nên riêng nội dung cho 2 phần này mình phải làm trước hoặc sau khi đi làm ở công ty. Thông thường thì sẽ làm vào buổi sáng hoặc trước một ngày phát hành.

  Cách thức giúp AI hoạt động hiệu quả cho tổ chức của bạn

Tóm lại để có thể cân bằng 2, 3 công việc cùng lúc mà không bị quá tải mình cần lên kế hoạch làm việc rõ ràng để tránh ảnh hưởng đến việc chính. Với mình thì có thể tóm gọn lại như sau:

  • Thức dậy 2 tiếng trước khi làm việc và dành thời gian đó để lên lịch nội dung và học những thứ mới.
  • Hiếm khi làm thêm sau giờ làm việc hoặc khi đã làm thì thường sẽ là để tạo nội dung trên nhiều nền tảng khác nhau.
  • Lên lịch cho các nội dung của mình để tránh ảnh hưởng đến việc chính.
  • Sử dụng thời gian rảnh rỗi tại nơi làm việc để đăng nội dung trên các tài khoản mạng xã hội.

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

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

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

Constructor trong Java là gì?

Constructor trong Java là gì?

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

Trong bài viết này, chúng ta sẽ tìm hiểu về constructor của một đối tượng, làm thế nào để tạo ra chúng, sự khác nhau giữa constructor mặc định và constructor do chúng ta định nghĩa và cuối cùng overloaded constructor là gì các bạn nhé!

  10 Java Web Framework tốt nhất
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Định nghĩa constructor

Trong Java, constructor là một phương thức đặc biệt, nó được dùng để khởi tạo và trả về đối tượng của lớp mà nó được định nghĩa. Constructor sẽ có tên trùng với tên của lớp mà nó được định nghĩa và chúng không được định nghĩa một kiểu giá trị trả về.

Ví dụ:

Trong ví dụ trên, chúng ta đã định nghĩa một constructor cho đối tượng Student, như các bạn thấy nó không có kiểu giá trị trả về và tên của nó trùng tên với lớp mà nó được định nghĩa.

Khi một đối tượng được khởi tạo bằng cách gọi constructor của nó với toán tử new thì nó sẽ gọi constructor của lớp cha và tất cả các instance variable sẽ được khởi tạo với giá trị mặc định của nó. Trở lại ví dụ trên thì khi khởi tạo đối tượng Student bằng cách gọi:

thì giá trị của biến age trong đối tượng Student sẽ có giá trị mặc định của kiểu int là 0.

Constructor mặc định

Nếu trong một đối tượng, chúng ta không định nghĩa một constructor nào cả thì mặc định Java sẽ thêm một constructor mặc định vào đối tượng của chúng ta.

Ví dụ, mình định nghĩa đối tượng Student như sau:

Lúc này, mình có thể khởi tạo đối tượng Student bằng cách:

Rõ ràng các bạn thấy, mặc dù mình không định nghĩa bất kỳ constructor nào trong đối tượng Student nhưng mình vẫn có thể khởi tạo đối tượng này.

Constructor mặc định sẽ không chứa bất kỳ tham số nào và khi được gọi để khởi tạo đối tượng, nó cũng gọi constructor của lớp cha và khởi tạo giá trị mặc định cho các instance variable.

Trong trường hợp chúng ta đã định nghĩa một constructor cho đối tượng:

thì Java sẽ không tự động thêm constructor mặc định nữa và khi đó nếu chúng ta cố gắng khởi tạo đối tượng bằng constructor mặc định thì sẽ bị lỗi compile ngay:

Constructor trong Java là gì?

Định nghĩa một constructor

Chúng ta có thể định nghĩa constructor cho một đối tượng bất kỳ, khi đó tất cả các thuộc tính của đối tượng bao gồm các phương thức, các instance variable có thể được gọi tùy theo định nghĩa của chúng ta.

Ví dụ:

Chúng ta có thể sử dụng bốn access modifier để định nghĩa cho một constructor, và do vậy chúng ta có thể giới hạn phạm vi truy cập của đối tượng từ những đối tượng khác.

Điều gì sẽ xảy ra nếu chúng ta định nghĩa một constructor với một kiểu giá trị trả về? Khi đó, Java sẽ coi nó như là một phương thức bình thường chứ không phải là một constructor.

Ví dụ:

Đối tượng Student lúc này chỉ có một constructor mặc định do Java thêm vào mà thôi. Nếu chúng ta khởi tạo đối tượng Student với một tham số name thì sẽ bị lỗi ngay.

Constructor trong Java là gì?

Overloaded constructor

Overloaded constructor là gì? Đó là khi chúng ta định nghĩa nhiều constructor cho một đối tượng và mỗi constructor sẽ có các tham số khác nhau cả về số lượng tham số lẫn kiểu dữ liệu của tham số.

Ví dụ:

Nguyên tắc để định nghĩa overloaded constructor là:

  • Các constructors, như mình đã nói, phải được định nghĩa sử dụng các tham số khác nhau cả về số lượng tham số lẫn kiểu dữ liệu của tham số.
  • Các constructor không được định nghĩa chỉ khác nhau ở access modifier.

Trong trường hợp đối tượng có nhiều constructor và chúng ta muốn gọi constructor này từ constructor khác thì bắt buộc chúng ta phải sử dụng từ khóa this như sau:

Câu lệnh this để gọi constructor khác này bắt buộc phải nằm ở dòng đầu tiên của constructor, nếu nó nằm sau một câu lệnh bất kỳ thì code chúng ta sẽ bị lỗi compile ngay:

Constructor trong Java là gì?

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

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

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

Database là gì? Các kiểu Database phổ biến và ứng dụng

Database là gì? Các kiểu Database phổ biến và ứng dụng

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

Ngày nay, công nghệ thông tin được xem là lĩnh vực đầu thể hiện mức độ phát triển của một quốc gia. Hiện nay, các ứng dụng liên quan thuộc phạm trù công nghệ IT đang rất được quan tâm. Database cũng là một trong những cụm từ phổ biến. Vậy Database là gì? Các mô hình Database phổ biến và ứng dụng cụ thể của mô hình này là gì? Hãy cùng khám phá các câu hỏi trên ngay sau đây.

Việc làm database hấp dẫn không cần kinh nghiệm cho bạn

Database là gì?

Database là từ được sử dụng phổ biến trong các lĩnh vực thuộc công nghệ thông tin, dữ liệu, lập trình và phần mềm… .Database là cơ sở dữ liệu, là một bộ sưu tập dữ liệu được tổ chức bày bản và thường được truy cập từ hệ thống máy tính hoặc tồn tại dưới dạng tập tin trong hệ quản trị cơ sở dữ liệu. Database còn có thể được lưu trữ trên thiết bị có chức năng ghi nhớ như: thẻ nhớ, đĩa cứng, CD…

Database là gì? Các kiểu Database phổ biến và ứng dụng

Database giữ vai trò chủ chốt trong các ứng dụng công nghệ

Vai trò của Database

Database có vai trò vô cùng quan trọng khi làm việc với hệ thống dữ liệu. Chúng giúp người dùng thành công trong việc kết nối các dữ liệu. Người dùng có thể truy cập hệ cơ sở dữ liệu nhanh chóng và dễ dàng hơn. Database chính là cơ sở nguồn để người dùng có thể truy xuất ra những thông tin cần thiết.

 Đặc điểm chính của Database chính là truy xuất ra những thông tin, dữ liệu bằng nhiều phương thức khác nhau. Các nội dung truy xuất được đảm bảo toàn vẹn dữ liệu ở mức độ cao. Đồng thời, nguồn thông tin khi xuất ra hoàn toàn không bị trùng lặp, nếu có thì xác suất cũng rất thấp. Một cơ sở dữ liệu Database cho phép nhiều người dùng đồng thời truy cập trong cùng một thời gian.

Các mô hình Database phổ biến hiện nay

  • Cơ sở dữ liệu Database dạng File: Database dạng File là dạng thường gặp nhất và cũng là mô hình phổ biến nhất hiện nay. Có thể dễ dàng thấy những tập tin, những thông tin được lưu trữ, chia sẻ và truy cập dưới dạng File. Cơ sở dữ liệu dạng File thường gặp nhất chính là *.mdb Foxpro. Bên cạnh đó, cơ sở dữ liệu này còn bao gồm những định dạng khác như text, dạng file ascii, dạng file *.dbf…
  • Cơ sở dữ liệu Database quan hệ: Đây cũng là một trong những mô hình dữ liệu được sử dụng rộng rãi nhất hiện nay. Ở mô hình này, các thực thể khác nhau, tức các nguồn dữ liệu khác nhau sẽ cùng được quy hợp, lưu trữ cùng một bảng dữ liệu và các dữ liệu này phải có quan hệ với nhau. Một vài cơ sở dữ liệu nổi tiếng có hỗ trợ Database quan hệ có thể kể đến như: Oracle, MS SQL Server, MySQL…
  • Cơ sở dữ liệu hướng đối tượng: Hệ cơ sở dữ liệu này cũng là một bảng dữ liệu thuần. Tuy nhiên, Database bổ sung thêm các trường hợp hướng đối tượng khác như: hành vi đối tượng nhằm thể hiện hành vi của đối tượng. Các đối tượng này cũng được phân cấp rất rõ ràng, mỗi cấp được gọi là một lớp dữ liệu. Hiểu một cách đơn giản hơn, chúng là tập hợp các nhóm đối tượng trong cùng một bảng và được thể hiện bằng dòng dữ liệu. Những hệ quản trị cơ sở dữ liệu hỗ trợ Database này bao gồm: MS SQL Server, Postgres, Oracle
  • Database bán cấu trúc: Cơ sở dữ liệu Database bán cấu trúc có thể lưu trữ nhiều dạng dữ liệu khác nhau. Và các thông tin, dữ liệu này thường được lưu trữ dưới định dạng XML. Ở mô hình này, các thông tin mô tả dữ liệu và đối tượng đều được trình bày trong các thẻ tag. Nhờ vào ưu điểm nổi bật này, hệ cơ sở dữ liệu vừa được mở rộng, vừa tiện lợi giúp người dùng có thể dễ dàng truy xuất những thông tin cần thiết. Theo các chuyên gia nghiên cứu, Database bán cấu trúc có thể sẽ là hướng đi mới đầy tiềm năng trong các lĩnh vực ứng dụng công nghệ dữ liệu.
  Database conventions
  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết

Ứng dụng của Database

Hệ thống cơ sở dữ liệu đóng vai trò vô cùng quan trong trong thời đại thông tin – kỹ thuật như hiện nay. Chức năng chính của Database có thể kể đến là: lưu trữ, truy xuất và cập nhật dữ liệu cùng nhiều ứng dụng khác.

Database giúp quản lý các dịch vụ bảo mật và phục hồi hệ thống quản trị dữ liệu, giúp thực thi các ràng buộc bên trong hệ cơ sở này. Đồng thời, quản lý và kiểm soát tất cả các máy khách kết nối, truy cập vào hệ thống dữ liệu ở hệ thống nguồn. Hỗ trợ xử lý tất cả các truy cập dữ liệu và các chức năng điều khiển khác.

Ngoài ra, Database còn cung cấp tính năng kiểm soát đồng thời, giúp bảo mật chặt chẽ hơn. Tạo môi trường đa người dùng với điều kiện kết nối an toàn. Nhiều người có thể truy cập đồng thời và truy xuất được những dữ liệu cần thiết

Trên đây là những kiến thức bổ sung về Database cũng như các mô hình hệ thống cơ sở dữ liệu. Đây hứa hẹn là những thông tin vô cùng cần thiết cho những người học tập và ứng dụng công nghệ thông tin. Trong tương lai, hứa hẹn lĩnh vực này sẽ tạo nên một xu hướng phát triển bùng nổ.

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

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

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

Viết code dễ đổi, dễ test như thế nào?

Viết code dễ đổi, dễ test như thế nào?

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

Các lập trình viên chuyển sang code Python từ các ngôn ngữ lập trình khác như Java, C, Golang… thường bắt đầu code bằng việc bật một cái IDE to đùng (PyCharm) lên, rồi viết chục dòng code, sau đó bấm nút “tam giác” để chạy từ trên xuống dưới. Đó là cách làm phổ biến, tiêu chuẩn khi viết code C, Java, Golang… nhưng là một cách làm rất không … Python.

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

Khi học Python, việc đầu tiên ta làm là bật python từ terminal, rồi gõ trực tiếp các dòng code vào đó, enter để thấy kết quả:

$ python3
Python 3.6.9 (default, Apr 18 2020, 01:56:04)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> str(21 * 2) + " is the answer of life."
'42 is the answer of life.'

Còn khi đi làm, viết code Python? Cũng vậy!

Khả năng gõ code trực tiếp, enter thấy ngay kết quả như trên, là một tính năng cực kỳ hấp dẫn/quan trọng của Python cũng như các ngôn ngữ lập trình có REPL như Ruby, Clojure, JavaScript, LISP, Ocaml, Elixir, F#… nó cho phép người dùng khám phá, vui chơi thoải mái với dữ liệu một cách tương tác, thấy kết quả nhanh nhất, thay vì phải ngồi tưởng tượng, đoán, chờ compile, và dựa vào IDE trợ giúp như các ngôn ngữ không có REPL.

Viết code dễ đổi, dễ test như thế nào?

Đây là chế độ “interactive mode” của Python interpreter, khái niệm này có cái tên khác chung hơn là: REPL.

(Chú ý: Golang có các project như gore hay yaegi nhưng đều rất hạn chế so với REPL của các ngôn ngữ kể trên).

REPL

REPL – Read Eval Print Loop, là môi trường nhận đầu vào từ người dùng (Read), chạy input đó (Eval), in kết quả ra màn hình (Print), và cứ tiếp tục vậy (Loop).

Khái niệm này bắt nguồn từ ngôn ngữ lập trình cổ thứ 2 thế giới: LISP.

Việc viết code khi dùng các ngôn ngữ có REPL thường theo các bước:

  • bật REPL lên
  • gõ code thử cho tới khi thu được kết quả mong muốn
  • copy code đó vào editor/IDE

Ví dụ

Đoạn code Python 3 sau sẽ truy cập API của GitHub, lấy các repo của Pymivn về, lọc ra các repo có > 0 star, sắp xếp giảm dần theo số star, rồi in ra output ở dạng dễ đọc.

# githubstars.py
from urllib.request import urlopen
import json


def main():
    with urlopen("https://api.github.com/users/pymivn/repos") as f:
        repos = json.load(f)

    has_stars = []
    for repo in repos:
        if repo["stargazers_count"] > 0:
            has_stars.append((
                repo["stargazers_count"], repo["html_url"]
                ))

    has_stars.sort(reverse=True)
    for stars, url in has_stars:
        output = "{} - {}".format(stars, url)
        print(output)


if __name__ == "__main__":
    main()

Nếu viết theo kiểu này, rồi cho vào IDE, bấm nút tam giác để chạy, những nhược điểm sau sẽ xuất hiện:

  • Mỗi lần chạy, code sẽ truy cập vào API GitHub 1 lần, việc này ngoài chậm, phụ thuộc vào mạng internet mỗi lần chạy, còn thêm nhược điểm nữa là sẽ dùng tốn “quota” hàng ngày của bạn (VD GitHub chỉ cho phép gọi API n lần 1 ngày).
  • Trừ khi bạn code 1 lần chuẩn luôn, còn không thì mất khoảng 5 7 lần mới ra đoạn code trên.
  • Không test từng phần (bước) của đoạn code được.

Thay vì vậy, viết lại một phần code như sau

from urllib.request import urlopen
import json

def getrepos():
    with urlopen("https://api.github.com/users/pymivn/repos") as f:
        repos = json.load(f)
    return repos

def main():
    pass

Lưu vào file github.py, rồi vào terminal, bật python3 lên, gõ:

>>> import github
>>> repos = github.getrepos()
>>> type(repos), len(repos)
(<class 'list'>, 23)
>>> one = repos[0]
>>> one.keys()
dict_keys(['id', 'node_id', 'name', 'full_name', 'private', 'owner', 'html_url', 'description', 'fork', 'url', 'forks_url', 'keys_url', 'collaborators_url', 'teams_url', 'hooks_url', 'issue_events_url', 'events_url', 'assignees_url', 'branches_url', 'tags_url', 'blobs_url', 'git_tags_url', 'git_refs_url', 'trees_url', 'statuses_url', 'languages_url', 'stargazers_url', 'contributors_url', 'subscribers_url', 'subscription_url', 'commits_url', 'git_commits_url', 'comments_url', 'issue_comment_url', 'contents_url', 'compare_url', 'merges_url', 'archive_url', 'downloads_url', 'issues_url', 'pulls_url', 'milestones_url', 'notifications_url', 'labels_url', 'releases_url', 'deployments_url', 'created_at', 'updated_at', 'pushed_at', 'git_url', 'ssh_url', 'clone_url', 'svn_url', 'homepage', 'size', 'stargazers_count', 'watchers_count', 'language', 'has_issues', 'has_projects', 'has_downloads', 'has_wiki', 'has_pages', 'forks_count', 'mirror_url', 'archived', 'disabled', 'open_issues_count', 'license', 'forks', 'open_issues', 'watchers', 'default_branch'])
>>> one['stargazers_count']
0
>>> has_stars = [p for p in repos if p['stargazers_count'] > 0]
>>> len(has_stars)
8
>>> stars_urls = [(p['stargazers_count'], p['html_url']) for p in has_stars]
>>> stars_urls
[(7, 'https://github.com/pymivn/awesome'), (2, 'https://github.com/pymivn/cpuisfast'), (1, 'https://github.com/pymivn/hoidap-python'), (1, 'https://github.com/pymivn/lekhome'), (4, 'https://github.com/pymivn/math-stats-ml'), (3, 'https://github.com/pymivn/people'), (1, 'https://github.com/pymivn/pyjobs_crawlers'), (4, 'https://github.com/pymivn/Python_Hanoi_Meetup')]
>>> stars_urls.sort(reverse=True)
>>> fmt = "{} - {}"
>>> for i in stars_urls:
...     print(fmt.format(*i))
...
7 - https://github.com/pymivn/awesome
4 - https://github.com/pymivn/math-stats-ml
4 - https://github.com/pymivn/Python_Hanoi_Meetup
3 - https://github.com/pymivn/people
2 - https://github.com/pymivn/cpuisfast
1 - https://github.com/pymivn/pyjobs_crawlers
1 - https://github.com/pymivn/lekhome
1 - https://github.com/pymivn/hoidap-python

Với cách làm này, chỉ cần gọi GitHub API duy nhất 1 lần, còn sau đó thử thoải mái cho đến khi thu được kết quả mong muốn thì copy vào file cuối cùng:

import json
from urllib.request import urlopen


def getrepos():
    with urlopen("https://api.github.com/users/pymivn/repos") as f:
        repos = json.load(f)
    return repos


def has_stars(repo):
    return repo["stargazers_count"] > 0


def filter_repos_have_stars(repos):
    return [p for p in repos if has_stars(p)]


def get_star_url(p):
    return (p["stargazers_count"], p["html_url"])


def main():
    repos = getrepos()
    repos_have_stars = filter_repos_have_stars(repos)
    stars_urls = [get_star_url(p) for p in repos_have_stars]
    stars_urls.sort(reverse=True)
    fmt = "{} - {}"
    for i in stars_urls:
        print(fmt.format(*i))


if __name__ == "__main__":
    main()

Sau này nếu code có bug, lại bật REPL lên, gọi các function để debug trực tiếp dễ dàng, từng bước một.

$ ipython
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import github
In [2]: repos = github.getrepos()

In [3]: have_stars = github.filter_repos_have_stars(repos)

In [4]: len(have_stars)
Out[4]: 8

In [5]: [github.get_star_url(p) for p in have_stars]
Out[5]:
[(7, 'https://github.com/pymivn/awesome'),
 (2, 'https://github.com/pymivn/cpuisfast'),
 (1, 'https://github.com/pymivn/hoidap-python'),
 (1, 'https://github.com/pymivn/lekhome'),
 (4, 'https://github.com/pymivn/math-stats-ml'),
 (3, 'https://github.com/pymivn/people'),
 (1, 'https://github.com/pymivn/pyjobs_crawlers'),
 (4, 'https://github.com/pymivn/Python_Hanoi_Meetup')]

In [8]: sorted([github.get_star_url(p) for p in have_stars], reverse=True)

Out[8]:
[(7, 'https://github.com/pymivn/awesome'),
 (4, 'https://github.com/pymivn/math-stats-ml'),
 (4, 'https://github.com/pymivn/Python_Hanoi_Meetup'),
 (3, 'https://github.com/pymivn/people'),
 (2, 'https://github.com/pymivn/cpuisfast'),
 (1, 'https://github.com/pymivn/pyjobs_crawlers'),
 (1, 'https://github.com/pymivn/lekhome'),
 (1, 'https://github.com/pymivn/hoidap-python')]

Dev với IPython

IPython (pip install ipython) cung cấp thêm các tính năng giúp cách code này hiệu quả hơn.

IPython có màu mè, auto-indent tự thụt sau for/if giúp gõ nhanh hơn.

Magic command %hist sẽ hiện full history những gì user đã gõ, giúp copy code để paste ra IDE/Editor dễ hơn, không bao gồm output.

Magic command %edit sẽ mở hẳn editor ra để sửa code, sau khi đóng lại, code sẽ được chạy, các biến sẽ tồn tại trong môi trường đang code.

Ví dụ này gõ %edit lần đầu định nghĩa list ns, rồi gõ %edit lần 2 để print ra list ns định nghĩa trước đó:

$ ipython
Python 3.6.9 (default, Apr 18 2020, 01:56:04)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: %edit
IPython will make a temporary file named: /tmp/ipython_edit_2v90rimj/ipython_edit_wf_rn_nc.py
Editing... done. Executing edited code...
Out[1]: '\nns = [1,2,3,4]\n'

In [2]: ns
Out[2]: [1, 2, 3, 4]

In [3]: %edit
IPython will make a temporary file named: /tmp/ipython_edit_qb43pml6/ipython_edit_tph7_5x6.py
Editing... done. Executing edited code...
[1, 2, 3, 4]
Out[3]: 'print(ns)\n'

Đổi editor

ra shell, gõ echo $EDITOR xem đang đặt là gì, thay bằng câu lệnh mở editor mình muốn, ví dụ

$ export EDITOR=nano
$ ipython

Chạy file rồi bật REPL

Python hay IPython đều hỗ trợ option -i, sau khi chạy với 1 file code sẽ tự động vào chế độ interactive mode

Jupyter

Code trên Jupyter (pip install jupyter) cũng cho khả năng linh hoạt tương tự. Code xong File > Save As Python file.

Unittest

Trong các ngôn ngữ không có REPL, cách thử 1 đoạn code nhanh nhất là viết 1 function cần thử, rồi viết unittest, rồi chạy test thay vì chạy cả 1 chương trình ngàn dòng. Với Python, ta chỉ cần bật REPL lên, import module vào và khám phá.

Code viết theo cách mới trên vừa dễ gõ trực tiếp trong REPL, vừa dễ viết unittest, ví dụ viết nhanh unittest chạy bằng pytest (pip install pytest) như sau:

# test_github.py
import github


def test():
    bad = {"stargazers_count": 0, "html_url": "bad_repo"}
    good = {
        "stargazers_count": 69,
        "html_url": "https://github.com/pymivn/awesome",
        "blah": "blo",
    }
    sample_repos = [bad, good]
    assert github.filter_repos_have_stars(sample_repos) == [good]
    assert github.get_star_url(good) == (
        good["stargazers_count"],
        good["html_url"],
    )
    assert github.has_stars(bad) is False
    assert github.has_stars(good) is True

Viết code bằng REPL hay bằng unittest TDD đều mang tới một kết quả chung: code dễ sửa, dễ test.

Tất nhiên REPL không thay thế hoàn toàn cho unittest, nhưng nó mang lại môi trường thử nghiệm nhanh chóng tương đương như hơn nhiều unittest ở các ngôn ngữ khác.

Hành động của chúng ta

Cài ngay IPython, Jupyter rồi bật lên mỗi khi muốn code Python.

Kết luận

Đừng đọc tiếng Anh theo kiểu Tiếng Việt, đừng code Python theo kiểu Java. REPL là một phát minh có sức mạnh khủng khiếp mà các Pythonista nên vận dụng, sử dụng, và lạm dụng hết mình.

Bài viết gốc được đăng tải tại pp.pymi.vn
Có thể bạn quan tâm:

Randomart và thuật toán The Drunken Bishop

Randomart và thuật toán The Drunken Bishop

Bài viết được sự cho phép của tác giả Huỳnh Quán Cẩm

Khi tạo OpenSSH key ta hay bắt gặp một cái hình tên là randomart.

  Thuật toán là gì? 11 thuật toán hàng đầu dành cho lập trình viên
  20 thuật ngữ chuyên sâu trong Quản lý Nhân sự nội bộ
The key's randomart image is:
+---[RSA 2048]----+
|   .  o.+.       |
|  o .. +..       |
| o o. ... .      |
|. =  . =..       |
|.o.o  o.S .      |
| +. o  +.o o     |
|. oo..+o= o .    |
| +...o=*o= .     |
|o......EB        |
+----[SHA256]-----+

Có bao giờ bạn thắc mắc hình này dùng để làm gì không?

1. randomart là gì?

Khi tạo kết nối SSH tới một host nào đó, OpenSSH sẽ yêu cầu host đó cung cấp RSS key fingerprint.

$ ssh host.xyz
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.

Fingerprint này được dùng để xác thực host. Điều bạn cần làm với fingerprint này là kiểm tra xem nó có trùng với key của host đích mà bạn đang kết nối tới hay không. Trùng thì không có gì để bàn rồi. Còn không trùng thì … rất có khả năng bạn đang bị tấn công MiTM.

Randomart và thuật toán The Drunken Bishop

Nhưng những fingerprint này thường là những chuỗi vô nghĩa. Cách để so trùng những chuỗi này là … so trùng từng chữ bằng mắt. Chúa tạo ra con người hoàn hảo tuyệt đối. Trừ cặp mắt thôi. Điểm mù, saccades, đủ thứ cả. Chưa kể còn sai sót nữa. Bắt tui ngồi so những chuỗi dạng nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 cả ngày, thà bỏ nghề đi làm cách mạng còn hơn.

Vì vậy, randomart được sinh ra nhắm giải quyết bài toán này. Nó trực quan hóa những chuỗi vô nghĩa thành hình ảnh. Từ những hình ảnh này, người dùng có thể nhanh chóng phán đoán được độ đúng đắn của host key.

Đồng thời những hình ảnh này có thể sẽ rất khác nhau cho dù fingerprint của chúng chỉ lệch nhau một chút. Từ đó giúp giảm thiểu sai sót của user người truồng mắt trần.

Randomart của fingerprint ở trên có hình dạng như dưới. Để thấy hình randomart, bạn cần bật VisualHostKey=yes trong SSH config.

$ ssh host.xyz
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
+---[RSA 2048]----+
| =+o...+=o..     |
|o++... *o .      |
|*.o.  *o.        |
|oo.  ..o.= .     |
|.+o. .. S =      |
|*=+ .  o = .     |
|OE .  . o        |
| o     .         |
|                 |
+----[SHA256]-----+
Are you sure you want to continue connecting (yes/no)?

Nếu bạn chưa nhận ra, đây là host key của Github . Nếu một ngày pull code từ Github về mà không thấy hình ảnh quen thuộc này, tui sẽ lập tức đánh hơi được sự bất thường. Cách mạng đã tràn về như một cơn sóng rồi sao?

Randomart được tạo ra từ một thuật toán sặc mùi bia rượu: The Drunken Bitshop (tạm dịch: Say quắc ông giám mục).

2. Thuật toán

Thuật toán được tóm gọn trong một đoạn văn như sau:

Bishop Peter finds himself in the middle of an ambient atrium. There are walls on all four sides and apparently there is no exit. The floor is paved with square tiles, strictly alternating between black and white. His head heavily aching—probably from too much wine he had before—he starts wandering around randomly. Well, to be exact, he only makes diagonal steps—just like a bishop on a chess board. When he hits a wall, he moves to the side, which takes him from the black tiles to the white tiles (or vice versa). And after each move, he places a coin on the floor, to remember that he has been there before. After 64 steps, just when no coins are left, Peter suddenly wakes up. What a strange dream!

tạm dịch: Giám mục Peter đang ở giữa một cái sảnh với bốn mặt tường. Vang vọng là tiếng hát Khánh Phương với bài “Không lối thoát”. Sàn nhà lót bằng gạch trắng đen hình vuông. Đầu ổng rất nhức. Hẳn rồi, tối qua quắc quá mà. Ổng bắt đầu đi loạng choạng. Chính xác thì ông chỉ đi những bước xéo như con tượng trên bàn cờ vua. Khi đụng tường, ông đi một bước ngang hoặc dọc. Điều đó giúp ông chuyển từ ô đen sang ô trắng và ngược lại. Sau mỗi bước, ông đều đánh dấu lãnh thổ bằng cách đái một bãi đặt một đồng xu lên sàn, để ghi nhớ là ông đã đi qua đó rồi. Sau 64 bước, không còn đồng xu dính túi, Peter đột nhiên tỉnh dậy. Quả là một giấc mơ vế lù.

2.1. Bắt đầu

Thuật toán khá đơn giản, Peter cũng bắt đầu từ chính giữa phòng, kí tự hiệu là ‘S’.

1111111
01234567890123456
+-----------------+x (column)
0|                 |
1|                 |
2|                 |
3|                 |
4|        S        |
5|                 |
6|                 |
7|                 |
8|                 |
+-----------------+
y
(row)

2.2. Di chuyển

Giám mục Peter có thể di chuyển theo 4 hướng: , ứng với từng cặp bit của fingerprint.

bits hướng
00
01
10
11

Bắt đầu với một fingerprint dạng MD5 với các octet a1:b2:c3:d4:e5:f6:...:e1. Ta tiến hành dịch nó từ HEX sang binary như sau:

10100001:10110010:11000011:...:11100001

Đọc theo Little Endian, nó sẽ thành:

01 00 10 10 : 10 00 11 10 : ... : 01 00 10 11

Áp dụng với bảng ở trên, các bước đầu tiên của giám mục Peter lần lượt là:      . Dấu chấm tượng trưng cho những điểm mà ổng đã đi qua.

1111111
01234567890123456
+-----------------+x (column)
0|                 |
1|                 |
2|        .        |
3|       . .       |
4|    . . S        |
5|     .           |
6|                 |
7|                 |
8|                 |
+-----------------+
y
(row)

Đụng tường

Như đã mô tả, khi đụng tường Peter sẽ đi ngang hay dọc tùy theo hướng.

Giả sử ông ta đang ở vị trí 0-4 (x-y), và hướng tiếp theo của chúng ta là , giám mục sẽ đi .

1111111
  01234567890123456
+-----------------+x (column)
0|                 |
1|                 |
2|        .        |
3|.      . .       |
4|.   . . S        |
5| . . .           |
6|  .              |
7|                 |
8|                 |
+-----------------+
y
(row)

2.3. Đánh dấu

Để đánh dấu, ứng với số lần mà ô đó được đi qua, ta sẽ dùng các kí hiệu sau.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  . o + = * B O X @  %  &  #  /  ^  S  E

Nếu ô đó được đi qua 7 lần, ta sẽ đánh O, 11 lần sẽ đánh &, S là ô bắt đầu và E là ô kết thúc.

Và cứ như thế, một hình ảnh randomart đã được tạo ra.

3. Tham khảo

Các bạn có thể tham khảo về thuật toán tại paper The drunken bishop: An analysis of the OpenSSH fingerprint visualization algorithm.

4. Bài viết này sẽ giúp tui tăng lương như thế nào?

Như thường lệ bài viết không có giúp bạn tăng lương. Cơ mà có một số điều rút ra là:

  1. Luôn kiểm tra host key khi kết nối SSH, để lỡ có ăn hành thì cũng biết đường mà … đánh răng.
  2. Bật VisualHostKey=yes trong SSH config để kiểm tra bằng hình ảnh thay vì bằng chuỗi.

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

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

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