Đã bao giờ bạn đặt ra các câu hỏi phỏng vấn “ngược” lại nhà tuyển dụng hay chưa? Một ứng viên tiềm năng không chỉ biết cách giữ bình tĩnh, điều tiết cảm xúc mà còn có thể “bật lại” nhà tuyển dụng bằng hàng loạt câu hỏi. Đừng suy nghĩ theo hướng qúa tiêu cực! Những câu hỏi này chỉ là bí quyết giúp bạn gia tăng tương tác. Đồng thời thể hiện sự tự tin, bản lĩnh của bạn mà thôi. Cùng TopDev tìm hiểu nhé!
Liệu bạn có thể trở thành một nhân tố sáng giá trong mắt nhà tuyển dụng? Không có giới hạn nào về hình thức và nội dung cả. Sự linh động các câu hỏi tùy thuộc ở bạn. Hãy cứ là chính mình! Thẳng thắn hỏi đáp cùng nhà tuyển dụng để ghi điểm sâu sắc đối với họ.
Ai sẽ là người phỏng vấn tôi?
Nếu may mắn vượt qua ải vòng đầu tiên, việc tiếp theo là chờ đợi email; cuộc gọi từ nhân sự về buổi phỏng vấn quyết định.
Bạn cần biết rõ người mà mình sẽ được gặp trong cuộc phỏng vấn là ai. Vì vậy, đừng ngần ngại hỏi nhà tuyển dụng xem ai sẽ là người phỏng vấn bạn tiếp theo. Tùy từng đối tượng mà cách bạn đưa ra câu hỏi cũng khác nhau.
Một vài tip chính là hãy nghiên cứu một số thông tin về họ nếu có thể. Ví dụ như: kinh nghiệm, cá tính, phong cách làm việc,… để làm chủ cuộc phỏng vấn. Điều này cũng thể hiện bạn là ứng viên biết cách tạo ấn tượng với bạn phỏng vấn.
Có thể cho tôi biết rõ hơn về cơ hội phát triển khi tôi làm việc tại đây? Lý do nào nhà tuyển dụng nhận thấy tôi phù hợp?
Trước khi ứng tuyển vào một vị trí bất kỳ, chí ít bạn đã có những hiểu biết cơ bản về doanh nghiệp của mình. Từ đó, bạn có cơ sở để hoàn thiện bản thân và chứng minh mình là một mảnh ghép phù hợp. Điều đó cho thấy sự tâm huyết và bạn thật sự khao khát vị trí này.
Câu hỏi phỏng vấn này là một thách thức lớn với họ đấy! Bạn sẽ đánh giá được mức độ quan tâm của họ về việc thiết lập lộ trình phát triển năng lực cho nhân viên. Dĩ nhiên, mức độ tốt hay không tốt là do cảm nhận của riêng bạn. Nếu nhà tuyển dụng không thể xác định được điều gì ở bạn phù hợp với công ty hoặc cố tình phớt lờ. Điều đó chứng tỏ họ chưa thật sự xây dựng ra một hệ giá trị để đánh giá ứng viên, phát triển nhân viên. Do vậy, bạn cần phải thận trọng hơn trong mọi quyết định của mình.
Tôi khó khăn trong việc xác định các mục tiêu vì chưa rõ những mong muốn cụ thể từ quý công ty/doanh nghiệp, tôi có thể biết thêm về điều này được không?
Tất nhiên nhà tuyển dụng sẽ hỏi bạn về mục tiêu và kế hoạch nghề nghiệp của bạn. Để “lật bài ngửa”, bạn hãy khéo léo pha chút “gia vị” để cuộc phỏng vấn thêm thú vị.
Cách tốt nhất chính là bạn chủ động yêu cầu họ đưa ra những tiêu chí cụ thể. Đâu là những mong muốn mà họ kỳ vọng mà người làm vị trí này có thể đạt được.
Điều này rất quan trọng. Vì nó giúp bạn xác định rõ mục đích sau cùng của cuộc tuyển chọn này. Liệu bạn là người họ đang tìm kiếm đồng hành phát triển? Hay bạn chỉ là một giải pháp thay thế tạm thời cho vị trí còn thiếu? Việc xác định rõ giúp bạn có thể hình dung được một phần những gì bạn cần phải làm. Chính điều này khiến bạn biết cách đáp ứng nhu cầu từ nhà tuyển dụng nếu may mắn được chọn lựa.
Người giữ vị trí này trước đây tại sao lại nghỉ việc?
Câu hỏi này không quá khó khăn để bạn nói với nhà tuyển dụng. Và tất nhiên, họ cũng có quyền tiết lộ hoặc giữ kín. Tuy nhiên, nếu nhận thấy các cá nhân từng giữ vị trí ấy có được một công việc tốt hơn tại nơi khác thì đó là dấu hiệu tốt. Có thể công ty chính là bệ phóng tốt để bạn học hỏi và phát triển.
Câu hỏi này còn có thể giúp bạn mở ra nhiều câu hỏi khác có liên quan. Một số nhà tuyển dụng họ không ngần ngại chia sẻ lý do tại sao các nhân viên trước lại nghỉ việc/chuyển công tác. Từ đó, bạn sẽ đánh giá được mức độ có liên quan đến công việc như khả năng đồng hành, mức độ cạnh tranh, áp lực công việc,…
Thách thức lớn nhất đối với người giữ vai trò này là gì?
Không vị trí nào là hoàn hảo. Trong thực tế, một số vai trò được tạo ra để gắn với một vấn đề cần phải giải quyết. Đó có thể hiểu là những sức hút mà công việc ảnh hưởng đến bạn.
Một người sử dụng lao động trung thực sẽ cho bạn biết áp lực nào nằm phía trước. Hoặc ít nhất họ cung cấp cho bạn những mô tả cơ bản về các khó khăn mà bạn cần vượt qua.
Bạn cần lắng nghe, đặt câu hỏi và ghi nhận các phản hồi. Đồng thời, chấp nhận các thách thức và trình bày một số ý tưởng về cách bạn sẽ giải quyết những trở ngại. Ban phỏng vấn từ nhà tuyển dụng sẽ ấn tượng về bạn đấy!
Lời kết
Có rất nhiều câu hỏi giúp bạn thách thức lại các nhà tuyển dụng. Mục đích chính của việc đặt ra câu hỏi chính là cho họ thấy bạn là một ứng viên có bản lĩnh. Bên cạnh năng lực chuyên môn, các kỹ năng, sự may mắn; thì những câu hỏi phỏng vấn ngược sẽ giúp bạn gia tăng thêm sự tự tin cho mình.
Bạn có thể tự đặt ra các câu hỏi cho riêng mình. Tuy nhiên, mọi thứ cần phải nằm trong một giới hạn cho phép. Hãy thận trọng trong giao tiếp. TopDev hy vọng, bạn sẽ thật sự thành công trong cuộc chính phục nhà tuyển dụng để có thể chứng tỏ mình lả một ứng viên tiềm năng.
Bài viết được sự cho phép của tác giả Trần Anh Tuấn
Chắc là khi các bạn làm giao diện web sẽ gặp nhiều thiết kế có các nút như checkbox hay là radio về các lựa chọn như là chọn giới tính, hoặc các sở thích. Tuy nhiên nó không phải là một checkbox hay radio bình thường khi chúng ta dùng <input type="checkbox"/>, mà là một dạng nào đó khác như nút Toggle giao diện Dark mode của site mình chẳng hạn.
Thì hôm nay mình sẽ hướng dẫn các bạn không chỉ về cách làm mà là về nguyên lý hoạt động của custom checkbox nữa để các bạn có thể hiểu cách nó hoạt động như thế nào mà có thể tuỳ biến thoải mái về sau cho những UIs lạ lẫm khác nữa nhé. Bắt đầu thôi nào.
Ở đây mình sẽ hướng dẫn các bạn tạo ra một cái Toggle giống chỗ tuỳ biến giao diện Dark Mode của blog mình nha.
Ở thẻ label mình dùng attribute là for truyền vào là toggle nghĩa là trỏ tới ID nha và ID ở đây là cái input có type là checkbox ở bên trong có id=”toggle” á, các bạn khi làm việc với form sẽ thấy thẻ label dùng for cho mục đích này khi nhấn vào label thì input sẽ focus hoặc checked. Vậy tại sao thẻ label lại bao bọc cả input và thẻ div là vì chúng ta sẽ dùng CSS Combinators để có thể làm được custom checkbox với dấu cộng(+). Dấu + trong CSS là cùng cấp nằm gần nhau ví dụ ở HTML trên là thẻ input trỏ tới thẻ div hen. Tí nữa code CSS các bạn sẽ thấy ngay. Lúc này giao diện ta có tạm thời như sau với một checkbox bình thường.
Lúc này mình sẽ code thêm CSS một chút cho nó trông oke hơn như sau
Mình thiết lập chiều cao và chiều rộng cho cái custom checkbox này là 34px và 60px, sau đó mình ẩn cái input[type=”checkbox”] đi bằng display: none và mình bắt đầu CSS tuỳ chỉnh cho cái .slider bên trong dưới dạng Toggle. Tạm thời lúc này ta có
Khá hơn được chút rồi, việc tiếp theo là tạo ra một cái hình tròn bên trong, chúng ta sẽ dùng pseudo class :before để tạo, nếu bạn nào chưa biết về before after thì có thể tìm hiểu thêm tại đây.
Mình CSS và có kết quả như hình
... code khi nãy.toggle .slider:before {background-color:#fff;bottom:4px;content:"";height:26px;left:4px;position:absolute;transition:.4s;width:26px;border-radius:50px;}
Tới đây chắc các bạn cũng hiểu rồi hen, nếu bạn nào chưa hiểu thì mình xin lý giải cách hoạt động nhé. Chúng ta ẩn input[type=”checkbox”] đi bằng display: none nhưng nó vẫn hiển thị trên HTML vì thế khi các bạn nhấn vào label thì nhờ for mà nó trỏ tới được input[type=”checkbox”] có ID là toggle đang bị ẩn đó và làm nó checked, nhờ vào :checked của input thì chúng ta có thể tuỳ biến được cái slider bên trong bằng CSS Combinator với dấu + chính là input[type="checkbox"]:checked + .slider lúc này ta có thể code CSS cho class .slider một cách dễ dàng.
Với hướng phân tích kỹ càng thì chúng ta có code như trên và tất nhiên sẽ có kết quả như mong đợi nhé.
Trước khi kết thì mình sẽ giải thích cho các bạn kỹ hơn một chút, vì ban đầu mình thiết lập cái toggle này có chiều cao là 34px thì khi mình làm cái hình tròn ở .slider:before là 26px thì mình có CSS là bottom: 4px và left: 4px thì các bạn trông thấy nó vừa vặn rất đẹp vậy tại sao biết là 4px, thì ta lấy chiều cao cái toggle là 34px trừ đi chiều cao hình tròn là 26px = 8px, ta chia cho 2 vì nó cách đều trên dưới trái phải nên là mỗi phía sẽ là 4px vì nó nằm bên trái ở dưới nên chúng ta sẽ dùng bottom: 4px và left: 4px.
Và khi nhấn vào checkbox thì mình có dùng transform: translateX(26px) thì là vì chiều rộng của toggle là 60px trừ đi 4px nhân 2 bên là 8px thì còn là 52px, mà bản thân hình tròn đã là 26px rồi thì lúc này translateX(26px) nữa sẽ là 52px đúng chuẩn luôn.
Một điều nữa là tại sao không dùng <input type="radio"/> trong trường hợp này là vì checkbox thì có thể check rồi bỏ check được còn radio thì không, radio thường dùng khi chọn một trong 2, hoặc 1 trong nhiều và chỉ chọn 1 cái mà thôi chứ không có check rồi bỏ check như checkbox được nên trong trường hợp này chúng ta không có dùng nhé.
Nhiều bạn hỏi là mình thấy người ta làm ra dấu tích màu trắng nền xanh khá đẹp thì nguyên lý làm cũng như cách mình chia sẻ ở trên nhưng style CSS khác đi thôi. Dấu tích thì nguyên lý của nó là một hình chữ nhật trong suốt có border-left và border-bottom sau đó xoay khoảng 45 độ là ra hình dấu tích rồi.
Như vậy là xong, hi vọng với bài viết này sẽ giúp các bạn hiểu được cách mà một custom checkbox hoạt động như thế nào để từ đó có thể tự làm ra được nhiều custom checkbox hay radio khác hoặc có thể hiểu được các đoạn code trên mạng họ làm như thế nào và cách làm ra sao để có thể áp dụng vào dự án của các bạn một cách hiệu quả. Cuối cùng thì xin chúc các bạn một ngày tốt lành và mạnh khoẻ.
Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng
Năm 2020, bên cạnh cuộc chiến khốc liệt với virus Novel Corona (nCov), vẫn dai dẳng và mãnh liệt cuộc chiến chống tin giả, tin quá sốc, tràn lan trên các mạng xã hội.
Trong các loại tin giả, có không ít tin được đưa theo hình thức chụp ảnh màn hình điện thoại, chụp trình duyệt trên máy tính để làm bằng chứng. Ảnh màn hình điện thoại dễ dàng làm giả với một lập trình viên mobile, còn với ảnh trình duyệt, ai cũng làm được, không cần tới trình độ PhotoShop đỉnh cao hay kỹ thuật lập trình chuyên nghiệp cỡ như các Pymiers.
Bài viết sẽ vạch trần kỹ thuật làm giả này, đồng thời lợi dụng nó để crawl dữ liệu ngay trên trang web, dùng chính trình duyệt mà không cần thêm gì khác như BeautifulSoup4 hay requests-html.
Web page là gì?
Web page là trang web, sử dụng HTML để biểu diễn cấu trúc.
HTML là gì?
HTML là một ngôn ngữ markup (đánh dấu), dùng để mô tả cấu trúc một web page. Nó sử dụng các tag (thẻ) để đánh dấu. Chuột phải vào màn hình, chọn “View page source” để xem code HTML của web page.
HTML không phải một ngôn ngữ lập trình (programming language).
HTML tag
Mỗi bộ phận của web page được đánh dấu sử dụng một cặp thẻ tương ứng, <a ...> </a> để đánh dấu một web link, <table> ... </table> để đánh dấu một bảng … Xem đầy đủ các tag tại đây
Mở một web site ra, rồi bật web console lên, hoặc đọc bài này nếu chưa biết cách.
Document, Window & DOM Elements
Mỗi web page là một document, mỗi “cửa sổ” (thời nay là 1 tab trình duyệt), là một window, đại diện cho cửa sổ đó. Mỗi document là một tree, với các node gọi là các Element.
Gõ vào web console document, đây chính là DOM của web page đang truy cập, thông qua object này, ta có thể làm đủ trò với những gì đang hiện trên trình duyệt.
Get element
Có vài cách để truy cập element, trong đó kể tới 2 methods:
document.getElementsByTagName: lấy các elements theo HTML tag của chúng
document.querySelectorAll: lấy các elements theo CSS selectors.
innerText là thuộc tính (attribute) của một element, chứa nội dung text của nó. Ví dụ sau sẽ thay đổi tiêu đề của bài viết, đây là cách làm tin giả rồi chụp mành hình, không cần dùng PhotoShop:
Thay vì dùng HTML tags, có thể dùng CSS class để tìm ra các element, ví dụ sau đây tìm các tin tuyển dụng trên trang HackerNews có chứa từ khóa Python và Remote, rồi hiển thị lên màn hình – có thể xem như crawl dữ liệu ngay trên trình duyệt:
/\bpython\b/i là Regex Object, dùng để tìm các đoạn text chứa từ khóa Python, chữ \b để đánh dấu boundary, tức kết quả sẽ không chứa pikapython mà chỉ chứa pika python, i để không phân biệt chữ hoa chữ thường.
Kết luận
DOM là khái niệm cơ bản về web page, là nền tảng để lập trình JavaScript ở phía client (trên trình duyệt), dù không phải Front-end developer, cũng nên biết dùng DOM, để automate, để “hack”.
Trước khi bắt đầu tìm hiểu sâu hơn về những nguyên tắc bắt buộc phải biết khi thiết kế API, ta cần định nghĩ rõ ràng với nhau. Như thế nào là một API tốt?, một API được đánh giá cao?.
Đây, câu này nghe khá là thấm (của Joshua Bloch):
APIs should be easy to use and hard to misuse
APIS nên dễ cho việc sử dụng đúng và khó cho sử dụng sai
Đấy, ai hỏi đừng có trả lời chi lòng vòng, cứ giải thích theo cách đơn giản nhất.
Một API thiết kế tốt thì dễ cho sử dụng đúng (đủ params, đúng URL, đúng token) thì trả về kết quả. Không rườm rà phức tạp.
Khó cho sử dụng sai (truyền sai, không đúng token, không có permission) thì không cho phép gọi xuống service để lấy kết quả
Đấy, tiêu chí chỉ vậy. Mở API document lên, bất cứ ông đẹp nào cũng hiểu API cung cấp những gì (what), bằng cách nào để thực hiện điều đó (how). Đấy là thiết kế API tốt
Trước khi bắt đầu hì hà hì hục implement cho từng API thì nên chú ý tới thiết kế API trước. Khâu thiết kế là vô cùng quan trọng.
It is such an important part when it comes to building an API that clients will love integrating with.
Đọc ở cuốn sách Production Ready GraphQL, tác giả viết hẳn phần design Schema đầu tiên. Đủ hiểu khi làm việc với API, thiết kế quan trọng như thế nào.
2. Tính ổn định (Stability) và nhất quán (Consistency)
Thường xuyên làm việc với API của Facebook mới thấm cảnh API thay đổi xoành xoạch. Rõ ràng tính ổn định đối với những API như vậy không cao. Tuy nhiên:
Facebook có hơn 1 tỷ người dùng, API thay đổi xoành xoạch cũng dễ hiểu. Nhiều feature cần implement.
Thay đổi là cần thiết để đáp ứng cho các nhu cầu mới, linh hoạt hơn.
Đó là chuyện của nhóm Dev cho công ty có hơn 2,6 tỷ người dùng. Còn thiết kế API mà anh em ta làm cho những project hoặc product cỡ trung bình, tính ổn định (Stability) nên được đem lên hàng đầu.
Anh em viết API nhiều cũng biết, cái implement đầu tiên khi release cho khách hàng là version 1. Sau này, khi bổ sung nhiều tính năng còn có thêm nhiều version khác nữa, …
Ngay từ ban đầu, nên clearly rõ ràng những thông tin version, đảm bảo tính nhất quán (Consistency) về sau (cứ lên version mới thì call với parameter function đó)
// Version kiểu params
http://appgido.com/api/information?version=1
// Hoặc kiểu này đều được
http://appgido.com/api/information/v1
Về tính nhất quán khi thiết kế và làm việc với API thì còn nhiều điều có thể áp dụng hoặc tránh đi.
Nếu đã sử dụng GraphQL để call API thì sử dụng đồng bộ, không nửa này nửa kia.
Sử dụng 2 field name mang cùng ý nghĩa, chỉ khác tên. Ví dụ: companyCode và companyVendorCode
Nếu đã sử dụng verbs (động từ) thì dùng cả. Đừng có chỗ thì dùng HTTP METHOD, chỗ lại createStudent, deleteStudent.
Một số API hỗ trợ PATCH, một số thì không.
Document khi field đó là require cho việc gọi API, nhưng không giải thích tại sao, truyền dư params, …
3. Tính linh hoạt (Flexibility)
Đơn giản nhất để hình dung về tính linh hoạt là Accept and Content-Type Headers. Hiện tại, thiết kế API cho version 1.0 có thể cho phép Accept kiểu JSON, nhưng sau này sẽ thêm XML.
Trường hợp những developer khác muốn sử dụng Content Type khác, API có thể chấp nhận được không?
Có linh hoạt cho sử dụng các types khác nhau hay không?. Một câu hỏi lớn khi thiết kế API
Khả năng linh hoạt khi thiết kế API còn phụ thuộc vào tính ràng buộc khi gửi request. Field nào thì bắt buộc, field nào không. Trường hợp field đó flexible thì tốt cho API Service hay không?
4. Tính bảo mật (Security)
Trước thì ít có ông nào thiết kế API mà lại lo tới cả bảo mật. Chủ yếu dùng JWT hoặc BearToken là xong. Tuy là tiện, nhưng anh em nhớ check lại dùm việc xác thực, cấp token có chính xác không?. Có thuận lợi không?.
Những API quan trọng thì bảo mật ở đâu?, có dễ bị attack hay không?.
Túm cái váy lại, một số thứ cần nhớ trong đầu để thiết kế API tốt là:
APIs generally allow you to do basic create, read, update, and delete operations on data – API về cơ bản cho phép CREATE, READ, UPDATE và DELETE data
Trước khi bắt đầu nhớ take care về Authozation với Authentication (Xác thực và phân quyền cho từng user). Đừng có ông nào không cần permission mà vẫn gọi API DELETE /user/id
Java là ngôn ngữ lập trình cấp cao, hướng đối tượng, mạnh mẽ, an toàn, độc lập với nền tảng, hiệu suất cao, đa luồng và ngôn ngữ lập trình di động. Nó được phát triển bởi James Gosling vào tháng 6 năm 1991. Nó cũng có thể được gọi là nền tảng vì nó cung cấp JRE và API của riêng nó.
2) Liệt kê các tính năng của ngôn ngữ lập trình Java.
Có các tính năng sau trong Ngôn ngữ lập trình Java.
Đơn giản: Java rất dễ học. Cú pháp của Java dựa trên C ++, giúp viết chương trình trong đó dễ dàng hơn.
Hướng đối tượng: Java tuân theo mô hình hướng đối tượng cho phép chúng ta duy trì mã của mình dưới dạng kết hợp của các loại đối tượng khác nhau kết hợp cả dữ liệu và hành vi.
Portable: Java hỗ trợ cách tiếp cận đọc một lần-ghi-bất cứ nơi nào. Chúng ta có thể thực hiện chương trình Java trên mọi máy. Chương trình Java (.java) được chuyển đổi thành mã byte (. Class) có thể dễ dàng chạy trên mọi máy.
Nền tảng độc lập: Java là ngôn ngữ lập trình độc lập nền tảng. Nó khác với các ngôn ngữ lập trình khác như C và C ++ cần một nền tảng để được thực thi. Java đi kèm với nền tảng mà mã của nó được thực thi. Java không phụ thuộc vào hệ điều hành được thực thi.
Bảo mật: Java được bảo mật vì nó không sử dụng các con trỏ rõ ràng. Java cũng cung cấp khái niệm về xử lý ByteCode và Exception giúp nó được bảo mật hơn.
Mạnh mẽ: Java là ngôn ngữ lập trình mạnh vì nó sử dụng quản lý bộ nhớ mạnh. Các khái niệm như thu gom rác tự động, xử lý ngoại lệ, vv làm cho nó mạnh mẽ hơn.
Architecture Neutral: Java là kiến trúc trung lập vì nó không phụ thuộc vào kiến trúc. Trong C, kích thước của các loại dữ liệu có thể thay đổi theo kiến trúc (32 bit hoặc 64 bit) không tồn tại trong Java.
Interpreted: Java sử dụng trình thông dịch Just-in-time (JIT) cùng với trình biên dịch để thực hiện chương trình.
Hiệu suất cao: Java nhanh hơn các ngôn ngữ lập trình truyền thống khác vì mã byte của Java “gần” với mã gốc. Nó vẫn chậm hơn một chút so với ngôn ngữ được biên dịch (ví dụ: C ++).
Đa luồng: Chúng ta có thể viết các chương trình Java xử lý nhiều tác vụ cùng một lúc bằng cách xác định nhiều luồng. Ưu điểm chính của đa luồng là nó không chiếm bộ nhớ cho mỗi luồng. Nó chia sẻ một vùng nhớ chung. Chủ đề rất quan trọng đối với đa phương tiện, ứng dụng Web, v.v.
Phân tán: Java được phân phối vì nó tạo điều kiện cho người dùng tạo các ứng dụng phân tán trong Java. RMI và EJB được sử dụng để tạo các ứng dụng phân tán. Tính năng này của Java làm cho chúng ta có thể truy cập các tệp bằng cách gọi các phương thức từ bất kỳ máy nào trên internet.
Động: Java là một ngôn ngữ động. Nó hỗ trợ tải động của các lớp. Nó có nghĩa là các lớp được tải theo yêu cầu. Nó cũng hỗ trợ các chức năng từ các ngôn ngữ bản địa của nó, tức là, C và C ++.
Ứng tuyển các vị trí việc làm Java lương cao trên TopDev
3) Bạn hiểu gì về máy ảo Java?
Máy ảo Java là một máy ảo cho phép máy tính chạy chương trình Java. JVM hoạt động như một công cụ thời gian chạy gọi phương thức chính có trong mã Java. JVM được thực hiện trong hệ thống máy tính. Mã Java được JVM biên dịch thành một Bytecode độc lập với máy và gần với mã gốc.
4) Sự khác biệt giữa JDK, JRE và JVM là gì?
a) JVM
JVM là từ viết tắt của Java Virtual Machine, nó là một máy trừu tượng cung cấp môi trường thời gian chạy trong đó mã byte Java có thể được thực thi. Đây là chỉ định hoạt động của Máy ảo Java. Việc triển khai của nó đã được cung cấp bởi Oracle và các công ty khác. Việc thực hiện của nó được gọi là JRE.
JVM có sẵn cho nhiều nền tảng phần cứng và phần mềm (vì vậy JVM phụ thuộc vào nền tảng). Nó là một cá thể thời gian chạy được tạo khi chúng ta chạy lớp Java. Có ba khái niệm về JVM: đặc tả, triển khai và cá thể.
b) JRE
JRE là viết tắt của Java Runtime Environment . Đây là việc thực hiện JVM. Môi trường chạy Java là một tập hợp các công cụ phần mềm được sử dụng để phát triển các ứng dụng Java. Nó được sử dụng để cung cấp môi trường thời gian chạy. Đây là việc thực hiện JVM. Nó tồn tại về mặt vật lý. Nó chứa một tập hợp các thư viện + các tệp khác mà JVM sử dụng trong thời gian chạy.
c) JDK
JDK là từ viết tắt của Java Development Kit. Đây là một môi trường phát triển phần mềm được sử dụng để phát triển các ứng dụng Java. Nó tồn tại về mặt vật lý. Nó chứa các công cụ phát triển JRE +. JDK.
5) Có bao nhiêu loại vùng nhớ được phân bổ bởi JVM?
Nhiều loại:
Class(Method) Area : Vùng lưu trữ các cấu trúc trên mỗi lớp như nhóm hằng số thời gian chạy, trường, dữ liệu phương thức và mã cho các phương thức.
Heap: Đây là vùng dữ liệu thời gian chạy trong đó bộ nhớ được phân bổ cho các đối tượng
Stack: Java Stack lưu trữ các khung. Nó chứa các biến cục bộ và kết quả một phần, và đóng một phần trong việc gọi và trả về phương thức. Mỗi luồng có một ngăn xếp JVM riêng, được tạo cùng lúc với luồng. Một khung mới được tạo ra mỗi khi một phương thức được gọi. Một khung bị phá hủy khi việc gọi phương thức của nó hoàn thành.
Thanh ghi bộ đếm chương trình: Thanh ghi PC (bộ đếm chương trình) chứa địa chỉ của lệnh máy ảo Java hiện đang được thực thi.
Ngăn xếp phương thức gốc: Nó chứa tất cả các phương thức riêng được sử dụng trong ứng dụng.
6) Trình biên dịch JIT là gì?
Trình biên dịch Just-In-Time (JIT): Nó được sử dụng để cải thiện hiệu suất. JIT biên dịch các phần của mã byte có chức năng tương tự cùng một lúc và do đó làm giảm lượng thời gian cần thiết để biên dịch. Ở đây, thuật ngữ của trình biên dịch mã số Viking dùng để chỉ một trình dịch từ tập lệnh của máy ảo Java (JVM) sang tập lệnh của một CPU cụ thể.
7) Platform là gì?
Platform là môi trường phần cứng hoặc phần mềm trong đó một phần mềm được thực thi. Có hai loại platform, dựa trên phần mềm và dựa trên phần cứng. Java cung cấp platform dựa trên phần mềm.
8) Sự khác biệt chính giữa nền tảng Java và các nền tảng khác là gì?
Có những khác biệt sau đây giữa nền tảng Java và các nền tảng khác.
Java là nền tảng dựa trên phần mềm trong khi các nền tảng khác có thể là nền tảng phần cứng hoặc nền tảng dựa trên phần mềm.
Java được thực thi trên đỉnh của các nền tảng phần cứng khác trong khi các nền tảng khác chỉ có thể có các thành phần phần cứng.
9) Điều gì mang lại cho Java bản chất ‘viết một lần và chạy mọi nơi’?
Mã byte. Trình biên dịch Java chuyển đổi các chương trình Java thành tệp class (Mã Byte) là ngôn ngữ trung gian giữa mã nguồn và mã máy. Mã byte này không phải là nền tảng cụ thể và có thể được thực thi trên bất kỳ máy tính nào.
10) Trình nạp lớp ( Classloader ) là gì?
Classloader là một hệ thống con của JVM, được sử dụng để tải các tệp lớp. Bất cứ khi nào chúng ta chạy chương trình java, nó sẽ được tải trước bởi trình nạp lớp. Có ba trình nạp lớp tích hợp trong Java.
Bootstrap ClassLoader: Đây là trình nạp lớp đầu tiên là superclass của trình nạp lớp mở rộng. Nó tải tệp rt.jar chứa tất cả các tệp lớp của Java Standard Edition như các lớp gói java.lang, các lớp gói java.net, các lớp gói java.util, các lớp gói java.io, các lớp gói java.sql, v.v.
Trình mở rộng lớp tải: Đây là trình nạp lớp con của Bootstrap và trình nạp lớp cha của trình nạp lớp hệ thống. Nó tải các tệp jar nằm trong thư mục $ JAVA_HOME / jre / lib / ext.
Trình tải lớp hệ thống / ứng dụng: Đây là trình nạp lớp con của trình nạp lớp mở rộng. Nó tải các tệp lớp từ đường dẫn lớp. Theo mặc định, classpath được đặt thành thư mục hiện tại. Bạn có thể thay đổi đường dẫn lớp bằng cách sử dụng chuyển đổi “-cp” hoặc “-classpath”. Nó còn được gọi là trình nạp lớp ứng dụng.
Đi dạo 1 vòng thấy có bài viết về console javascript hay quá. Toàn hàm mình không biết. Nên đã pickup ra 1 số hàm hay mà ít người biết đến để mọi người tham khảo. Có cả ảnh đính kèm luôn.
console.log()
Đây là hàm mà chắc ai cũng biết đến nó rồi. Thế nhưng tham số bên trong nó thì lại ít người để ý đến.
Đoạn text ở trong hàm console.log() có thể được thay thế với form như bên dưới:
%o / %O – for objects;
%d / %i – for integers;
%s – for strings;
%f – for floating-point numbers;console.log(“Object value: %o with string substitution”, {string: “str”, number: 10});
đằng sau %o có thể thay thế bằng object. Khi đó trên console hiển thị như sau:
Điểm đặc biệt hơn nữa là có thể dùng CSS trong console.log() được.
Khi hiển thị ra console, chúng ta có thể đóng, mở đều được cả (ấn vào cái nút tam giác).
Hơn nữa, nó có cả phương thức console.groupCollapsed().
Vì hàm console.group() này có thể đóng, mở block lại khi hiển thị trên console nên sẽ giúp ta tổng hợp lại và xuất ra console trông rất dễ nhìn.
Tuy nhiên số lượng group với groupCollapsed **mà không bằng với số lượng **GroupEnd thì lúc hiển thị nó hơi kì kì. Giống như thẻ tag trong html vậy. Đã mở tag thì phải có chỗ để đóng tag.
Do đó để không quên thì khi viết hàm group() thì cố gắng viết luôn hàm GroupEnd() ở bên dưới là tốt nhất.
Nếu ai lập trình nhiều PHP hay các ngôn ngữ khác cũng đều gặp cái hàm trace() này rồi. Hàm này để mục đích là duyệt vết thôi.
console.trace("Logging the way down here!");
Khi đó sẽ hiển thị ra màn hình như sau:
console.warn(), console.error()
Dựa vào level của log mà chúng ta muốn hiển thị hay không muốn hiển thị log ra màn hình. Trong javascript cũng có những hàm kiểu như vậy.
Mặc định thì level đang là debug nên nó không hiển thị ra console. Nếu chúng ta thay đổi sang level khác thì nó sẽ hiển thị.
Dưới đây là ví dụ:
console.warn("This is a warning!");
console.error("This is an error!");
console.info("This is very informative!");
console.debug("Debugging a bug!");
console.assert(true, "This won't be logged!");
console.assert(false, "This will be logged!");
Kết quả sau khi thực hiện:
console.time()
Hàm này cũng gặp nhiều trong PHP rồi mà bây giờ mình mới biết nó trong console javascript.
Vì form quá phức tạp, chúng ta cần thêm một bài viết nữa về validation với html.
Với HTML5 chúng ta có một số kiểu input để validate những giá trị mà user đưa vào, ko cần tự viết javascript để check, chỉ đơn giản là khai báo mấy cái attribute, trường hợp phức tạp hơn, chúng ta có thể can thiệp trong cái Validation API để có kết quả mong muốn
Luôn nhớ validate ở phía client không có nghĩa là ko cần đến validate ở server.
số ký tự nhập vào phải thỏa lớn hơn hoặc bằng minlength
maxlength
text, search, url, tel, email, password, textarea
số ký tự nhập vào phải thỏa nhỏ hơn hoặc bằng maxlength
Ví dụ
<form><label for="name">Enter username (upper and lowercase letters): </label><input type="text"name="name"id="name"requiredpattern="[A-Za-z]+"><button>Submit</button></form>
Quá trình validate dữ liệu
Quá trình này sẽ thông qua bộ Validation API, nó có thể là trên cả form hoặc trên từng element trong form. Được thực hiện bằng một trong các cách sau bằng cách gọi checkValidity() của các element input, select, button, textarea. Nó sẽ chỉ validate dữ liệu trên element đó thôi. Nó thường được thực hiện bởi trình duyệt, sau đó chúng ta dùng selector của CSS là :valid và :invalid để format gọi checkValidity() hoặc reportValidity() trên thằng form Khi form được submit bằng click ‘hoặc ‘<button type=’submit’ /> hoặc ấn enter
Lưu ý
Nếu set novalidate trên thẻ <form novalidate />, là chúng ta bỏ qua hết việc validate
Khi gọi submit() trên form, không trigger validation, phương thức này sẽ gửi hết dữ liệu của form lên server dù nó có hay không thỏa điều kiện. Nên gọi sự kiện click() của nút submit
Can thiệp vào quá trình validate bằng bộ Validation API
Ý tưởng chính là bắt một sự kiện nào đó trên element như onchange, rồi trigger một đoạn javascript để validate, sau đó dùng phương thức field.setCustomValidity() để set kết quả validate: nếu là String rỗng nghĩa là ok, còn ngược lại là error, đoạn string này sẽ đem đi hiển thị như thông báo error cho user
Giới hạn file size khi upload
<label for="FS">Select a file smaller than 75 kB : </label><input type="file"id="FS">
Dùng javascript để đọc file được chọn, FIle.size(), so sánh kích thước này rồi trả về kết quả cho trình duyệt
functioncheckFileSize(){varFS= document.getElementById("FS");var files =FS.files;// Nếu có ít nhất 1 file được chọnif(files.length >0){if(files[0].size >75*1024){// kiểm tra sizeFS.setCustomValidity("The selected file must not be larger than 75 kB");return;}}// Không có file, ko check.FS.setCustomValidity("");}
Hook cái phương thức này vào trong sự kiện mong muốn
Để thay đổi nội dung câu thông báo, sử dụng element.setCustomValidity('thông báo') trên các element: <fieldset>, <input>, <output>, <select>, <button>, <textarea>
const nameInput = document.querySelector('input');const form = document.querySelector('form');
nameInput.addEventListener('input',()=>{
nameInput.setCustomValidity('');
nameInput.checkValidity();});
nameInput.addEventListener('invalid',()=>{if(nameInput.value ===''){
nameInput.setCustomValidity('Enter your username!');}else{
nameInput.setCustomValidity('Usernames can only contain upper and lowercase letters. Try again!');}});
Trong thế giới lập trình, việc tạo số ngẫu nhiên là một yêu cầu cơ bản và quan trọng, ảnh hưởng trực tiếp đến chất lượng và tính ngẫu nhiên của dữ liệu. Java, với sự đa dạng và mạnh mẽ của mình, cung cấp nhiều cách để sinh số ngẫu nhiên. Bài viết này sẽ giới thiệu ba phương pháp chính để tạo số ngẫu nhiên trong Java.
Hướng dẫn tạo số ngẫu nhiên bằng Java chi tiết
Để tạo một trình tạo số ngẫu nhiên (generator), đơn giản chỉ việc tạo một new instance của Random.
Random generator = newRandom();
Khi sử dụng hàm tạo này, bạn sẽ nhận ra rằng các trình tạo số ngẫu nhiên thuật toán không thực sự ngẫu nhiên, chúng thực sự là các thuật toán tạo ra một chuỗi số cố định nhưng trông ngẫu nhiên.
Khi tạo một generator, nó sẽ khởi tạo chuỗi của nó từ một giá trị được gọi là “seed” của nó. Khi chúng ta sử dụng constructor không có tham số, nó sẽ tạo seed có một giá trị khác biệt với bất kỳ lời gọi nào khác của constructor này. Nhưng chúng ta không kiểm soát được giá trị đó là gì, hoặc thậm chí đảm bảo hoàn toàn rằng nó sẽ khác với seed được sử dụng bởi các lời gọi khác trên constructor này.
Nếu thích, chúng ta cũng có thể chỉ định một giá trị bất kỳ thuộc kiểu “long” để khởi tạo cho seed. Ví dụ:
Random generator = newRandom(19900828);
Sau khi đã có generator, gọi các phương thức nextXxx() để tạo các giá trị ngẫu nhiên:
nextInt() : trả về một số ngẫu nhiên trong khoảng giá trị của int value (từ -2^31 đến 2^31-1).
nextInt(maxNumber) : trả về một số int ngẫu nhiên từ 0 đến giá trị < maxNumber.
nextLong() : trả về một số ngẫu nhiên kiểu long. Vì Random sử dụng giá trị seed chỉ 48bits, nên thuật toán random không thể trả về tất cả các giá trị thuộc kiểu long.
nextFloat(): trả về một số ngẫu nhiên trong khoảng 0.0 và <1.0
nextDouble() : tương tự như nextFloat() như độ dài phần thập phân lớn hơn.
nextBoolean() : trả về giá trị true, false ngẫu nhiên.
Ví dụ giới hạn giá trị Random Number
Đôi khi chúng ta cần số ngẫu nhiên nằm trong một phạm vi khác nhau. Chúng ta có thể làm cho các số ngẫu nhiên nằm trong một phạm vi rộng hơn hoặc hẹp hơn bằng cách nhân chúng với một hệ số tỷ lệ. Chúng ta cũng có thể đặt các số ngẫu nhiên nằm trong một phạm vi được chuyển sang các số lớn hơn hoặc nhỏ hơn so với ban đầu bằng cách cộng thêm (hoặc trừ) một phần bù từ các số ngẫu nhiên.
Ví dụ 1: chúng ta có một game có 4 người chơi, mỗi người có 1 số từ một đến 4. Chương trình của chúng ta sẽ random từ 1 đến 4 để lựa chọn người may mắn có số trùng với số được random. Đơn giản chỉ việc gọi hàm nextInt(4), hàm này sẽ trả về giá trị từ 0 đến 3, nên chúng ta cần cộng thêm 1 để có kết quả như ý muốn.
int value = generator.nextInt(4) + 1;
Ví dụ 2: Cần vẽ random một line có góc từ 0 đến 360 độ.
double value = generator.nextDouble() * 360.0;
Ví dụ 3: Random int number trong khoảng được chỉ định.
int value = generator.nextInt((max - min) + 1) + min;
Ví dụ 4: Trong một số ứng dụng đăng nhập bằng số điện thoại như Google, sau khi nhập số điện thoại, Google sẽ gửi một mã xác nhận số điện thoại gồm 6 số ngẫu nhiên. Chúng ta cũng có thể tạo số ngẫu nhiên này với Random.
int code = (int) Math.floor(((Math.random() * 899999) + 100000));
Lưu ý: Instances của java.util.Random là Thread safe. Tuy nhiên, việc sử dụng đồng thời cùng một đối tượng java.util.Random trong môi trường đa luồng (multi-thread) có thể gặp phải sự tranh chấp và hiệu suất kém. Thay vào đó hãy xem xét sử dụng ThreadLocalRandom trong các thiết kế đa luồng. Nếu cần Security random có thể sử dụng SecureRandom.
Để tạo random một số ngẫu nhiên trong Java, chúng ta có thể sử dụng các hàm random trong Math class và Random class mà Java đã hỗ trợ sẵn.
Random số trong Java bằng Random class
Trong Java để tạo một số ngẫu nhiên chúng ta có thể sử dụng class java.util.Random đã được hợp trong JDK. Class này cung cấp nhiều phương thức để tạo các kiểu số ngẫu nhiên khác nhau, chẳng hạn như như int, float, long, và boolean.
import java.util.Random;
publicclassRandomExample {
publicstaticvoidmain(String[] args) {
Randomrand=newRandom();
intrandomInt= rand.nextInt(100); // Số ngẫu nhiên từ 0 đến 99
System.out.println("Random int: " + randomInt);
}
}
Sử dụng phương pháp Math.random()
Phương pháp Math.random() trả về một giá trị double ngẫu nhiên từ 0.0 đến 1.0.
Sử dụng lớp java.util.concurrent.ThreadLocalRandom
Lớp ThreadLocalRandom cung cấp một cách hiệu quả hơn để tạo số ngẫu nhiên trong các ứng dụng đa luồng.
import java.util.concurrent.ThreadLocalRandom;
publicclassThreadLocalRandomExample {
publicstaticvoidmain(String[] args) {
intrandomInt= ThreadLocalRandom.current().nextInt(0, 100); // Số ngẫu nhiên từ 0 đến 99
System.out.println("ThreadLocalRandom int: " + randomInt);
}
}
Sử dụng phương pháp java.util.Random.ints()
Phương pháp ints() của lớp Random cho phép tạo ra một luồng các số nguyên ngẫu nhiên.
import java.util.Random;
publicclassRandomIntsExample {
publicstaticvoidmain(String[] args) {
Randomrand=newRandom();
rand.ints(5, 0, 100).forEach(System.out::println); // 5 số ngẫu nhiên từ 0 đến 99
}
}
Sử dụng lớp java.security.SecureRandom
Lớp SecureRandom cung cấp số ngẫu nhiên với độ bảo mật cao, thường được dùng trong các ứng dụng yêu cầu tính ngẫu nhiên mạnh mẽ như mật mã học.
import java.security.SecureRandom;
publicclassSecureRandomExample {
publicstaticvoidmain(String[] args) {
SecureRandomsecureRand=newSecureRandom();
intrandomInt= secureRand.nextInt(100); // Số ngẫu nhiên từ 0 đến 99
System.out.println("SecureRandom int: " + randomInt);
}
}
Tạo chuỗi ngẫu nhiên – Random string
Có nhiều trường hợp chúng ta cần tạo chuỗi ngẫu nhiên, chẳng hạn tạo ra mã captcha để chống spam, gửi mã code xác nhận tài khoản, …. Có nhiều cách để tạo chuỗi ngẫu nhiên, trong bài này tôi sẽ hướng dẫn các bạn tự tạo chuỗi ngẫu nhiên và sử dụng thư viện Apache common.
Tự tạo chuỗi ngẫu nhiên
Để tạo một chuỗi ngẫu nhiên, chúng ta sẽ định nghĩa một chuỗi các ký tự được phép xuất hiện trong chuỗi ngẫu nhiên. Sau đó sẽ sử dụng Random để tạo một giá trị index ngẫu nhiên từ chuỗi đã định nghĩa trước đó. Cứ thực hiện random index và truy xuất ký tự từ index cho đến khi đầy đủ số lượng ký tự mong muốn.
Trong ví dụ này, tôi sẽ tạo 2 phương thức:
randomAlphaNumeric(): Tạo một chuỗi ngẫu nhiên chỉ bao gồm các ký tự từ a-z, A-Z và 0-9, không bao gồm các ký tự đặc biệt.
randomPassword(): Tạo một chuỗi password ngẫu nhiên bao gồm ít nhất 1 ký tự đặc biệt và 1 ký tự số.
packagecom.gpcoder.random;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.Random;importjava.util.function.Consumer;publicclassRandomStringExmple {privatestaticfinalString alpha = "abcdefghijklmnopqrstuvwxyz"; // a-zprivatestaticfinalString alphaUpperCase = alpha.toUpperCase(); // A-ZprivatestaticfinalString digits = "0123456789"; // 0-9privatestaticfinalString specials = "~=+%^*/()[]{}/!@#$?|";privatestaticfinalString ALPHA_NUMERIC = alpha + alphaUpperCase + digits;privatestaticfinalString ALL = alpha + alphaUpperCase + digits + specials;privatestaticRandom generator = newRandom()
/*** Random string with a-zA-Z0-9, not included special characters*/publicString randomAlphaNumeric(intnumberOfCharactor) {StringBuilder sb = newStringBuilder();for(inti = 0; i < numberOfCharactor; i++) {intnumber = randomNumber(0, ALPHA_NUMERIC.length() - 1);charch = ALPHA_NUMERIC.charAt(number);sb.append(ch);}returnsb.toString();}/*** Random string password with at least 1 digit and 1 special character*/publicString randomPassword(intnumberOfCharactor) {List<String> result = newArrayList<>();Consumer<String> appendChar = s -> {intnumber = randomNumber(0, s.length() - 1);result.add(""+ s.charAt(number));};appendChar.accept(digits);appendChar.accept(specials);while(result.size() < numberOfCharactor) {appendChar.accept(ALL);}Collections.shuffle(result, generator);returnString.join("", result);}publicstaticintrandomNumber(intmin, intmax) {returngenerator.nextInt((max - min) + 1) + min;}publicstaticvoidmain(String a[]){intnumberOfCharactor = 8;RandomStringExmple rand = newRandomStringExmple();System.out.println("randomString1: "+ rand.randomAlphaNumeric(numberOfCharactor));System.out.println("randomString1: "+ rand.randomAlphaNumeric(numberOfCharactor));System.out.println("randomString1: "+ rand.randomAlphaNumeric(numberOfCharactor));System.out.println("randomPassword1: "+ rand.randomPassword(numberOfCharactor));System.out.println("randomPassword2: "+ rand.randomPassword(numberOfCharactor));}}
Chạy chương trình trên nhiều lần, chúng ta sẽ thấy các kết quả khác nhau:
UUID (Universally Unique Identifier) hay còn được biết đến như là GUID (Globally Unique Identifier), là một chuỗi đại diện cho một mã định danh duy nhất, không thể thay đổi (immutable), và có giá trị dài 128 bit.
UUID được sử dụng để tạo tên file ngẫu nhiên, id session trong ứng dụng web, id transaction, …
Phương thức java.util.UUID.randomUUID() được sử dụng để sinh ra một chuỗi ngẫu nhiên có độ dài 32 ký tự (128 bit) được biểu diễn ở hệ hệ thập lục phân (hex: 0-9A-F) và 4 ký tự phân tách (–).
Bạn tò mò muốn biết về công việc chính của một tester? Cơ hội nào cho nghề kiểm thử? Bài viết này của TopDev sẽ giúp bạn hiểu rõ hơn về tester là gì, nghề kiểm thử đòi hỏi những kỹ năng nào, vai trò của người kiểm thử và các nhiệm vụ quan trọng mà người kiểm thử thực hiện trong quá trình phát triển phần mềm.
Tester là gì?
Tester là gì? Tester hay còn được gọi là người kiểm thử phần mềm là người chịu trách nhiệm đảm bảo chất lượng của phần mềm bằng cách phát hiện các lỗi và vấn đề, đồng thời xác nhận rằng phần mềm hoạt động đúng như mong đợi. Đây là một vai trò quan trọng trong quy trình phát triển phần mềm, giúp đảm bảo rằng sản phẩm cuối cùng sẽ hoạt động ổn định và đáp ứng được các yêu cầu của người dùng.
Nói một cách đơn giản, vai trò của Tester là kiểm tra sản phẩm và cung cấp báo cáo cho nhóm Developer về bất kỳ vấn đề nào cần cải thiện cho sản phẩm.
Tuy nhiên, trong ngành Công nghệ Thông tin, tuy cũng có 1 vị trí có chức năng là kiểm tra, thử nghiệm và kiểm định chất lượng nhưng khác với một Tester thông thường, Tester ngành IT có rất nhiều tên gọi khác nhau như Software Tester/ Technical Tester…
Thực ra, đôi khi Tester không hoàn toàn xác định được tất cả lỗi của một hệ thống hay phần mềm, tuy nhiên họ sẽ dựa vào các nguyên tắc, quy luật để tìm ra lỗi bugs. Các nguyên tắc và quy luật này sẽ thay đổi tùy theo sản phẩm, phần mềm, tiêu chuẩn, kỳ vọng hoặc hoạt động mà sẽ có sự thay đổi khác nhau.
Xem ngay những tin đăng tuyển Tester mới nhất trên TopDev
Vai trò của Tester là gì?
Các Tester là người nắm vững các kiến thức tổng quát, vững chắc về các công cụ và kỹ thuật, cùng với một số kiến thức/kinh nghiệm phát triển phần mềm. Trong giai đoạn lập kế hoạch thử nghiệm và chuẩn bị thử nghiệm, các Tester thường xem xét và đóng góp vào kế hoạch kiểm tra, cũng như phân tích và đánh giá các yêu cầu và thông số kỹ thuật.
Họ thường là người tham gia hoặc chịu trách nhiệm hoàn toàn trong việc xác định các điều kiện thử nghiệm và tạo ra các thiết kế thử nghiệm, trường hợp thử nghiệm, đặc tả quy trình thử nghiệm và dữ liệu thử nghiệm.
Sau đó, họ có thể tự động hóa hoặc giúp tự động hóa các bài kiểm tra. Họ thường là người giữ vai trò thiết lập môi trường thử nghiệm hoặc hỗ trợ quản trị hệ thống và nhân viên quản lý mạng làm việc đó
Khi các thử nghiệm được triển khai và vận hành, các Tester được yêu cầu note lại quá trình kiểm tra, đánh giá kết quả và ghi lại các lỗi được tìm thấy. Họ giám sát thử nghiệm và môi trường thử nghiệm, họ sử dụng các công cụ cho công việc và thu thập các số liệu về hiệu suất.
Yêu cầu công việc của Tester
Hiểu sản phẩm cần được kiểm tra
Lập kế hoạch chiến lược thử nghiệm, để thực hiện các thử nghiệm và tìm ra các vấn đề tiềm ẩn
Phân tích ưu và nhược điểm của kế hoạch cụ thể, cũng như rủi ro liên quan đến từng thành phần và giao diện trong sản phẩm.
Check lại các code cần kiểm tra
Làm việc với các tập lệnh và công cụ tự động hóa
Luôn cập nhật các khía cạnh kỹ thuật của cơ sở hạ tầng dự án (ví dụ: trình duyệt, cơ sở dữ liệu, ngôn ngữ, v.v.)
Phân tích và ghi nhận về các vấn đề và cung cấp phản hồi thích hợp.
Có thể nói mục tiêu được ưu tiên hàng đầu của các Tester là tìm ra được các lỗi phần mềm – báo cáo – khắc phục lỗi. Thông thường, mỗi loại sản phẩm khác nhau đều có chức năng khác nhau, cái khó của nghề Tester là phải có kiến thức tổng quát để có thể trả về báo cáo kết quả hiệu quả nhất cho team.
Họ sẽ phải đóng vai là một người dùng và sử dụng sản phẩm, len lỏi trong hết tất cả các ngóc ngách của ứng dụng để tìm lỗi.
Việc test thử phần mềm rất quan trọng vì nếu có bất kỳ vấn đề hoặc lỗi nào trong phần mềm, nó có thể được xác định sớm và được giải quyết trước khi giao/ra mắt sản phẩm phần mềm. Sản phẩm phần mềm được kiểm tra sẽ đảm bảo được độ tin cậy, bảo mật và hiệu suất cao, giúp tiết kiệm thời gian, hiệu quả chi phí và mang đến sự hài lòng cho khách hàng.
Việc kiểm tra rất quan trọng vì khi một phần mềm vẫn còn lỗi được ra đời thì có thể gây tốn kém hoặc thậm chí nguy hiểm. Lỗi phần mềm có thể gây ra thiệt hại về tiền bạc và cả con người. Trong quá khứ đã có rất nhiều trường hợp đáng tiếc xảy ra vì đã không chú trọng các quy trình kiểm tra của Tester.
Lợi ích của việc vận dụng tốt vai trò Tester là gì?
Dưới đây là những lợi ích của việc tận dụng tốt giá trị của Tester:
Hiệu quả về chi phí: Đây là một trong những lợi thế quan trọng của Tester. Kiểm tra bất kỳ dự án CNTT nào đúng thời hạn sẽ giúp bạn tiết kiệm tiền của mình trong dài hạn. Trong trường hợp nếu các lỗi được phát hiện trong giai đoạn testing trước đó, thì chi phí sửa chữa sẽ thấp hơn.
Bảo mật: Đây là lợi ích nhạy cảm và dễ bị tấn công nhất của Tester. Mọi người đang tìm kiếm các sản phẩm đáng tin cậy, Tester giúp loại bỏ rủi ro và vấn đề khác.
Chất lượng sản phẩm: Đây là yêu cầu thiết yếu của bất kỳ sản phẩm phần mềm nào. Việc sử dụng Tester sẽ đảm bảo một sản phẩm chất lượng được cung cấp đến tay khách hàng.
Sự hài lòng của khách hàng: Mục đích chính của bất kỳ sản phẩm nào là mang lại sự hài lòng cho khách hàng của họ. Vì thế nên kiểm tra UI/UX đảm bảo trải nghiệm người dùng tốt nhất.
Các Tester thường được yêu cầu các kỹ năng không liên quan gì đến tự động hóa, yêu cầu đối với một Tester là phải có sự hiểu biết rộng và thành thạo các công cụ có sẵn. Tuy nhiên, không phải ai cũng có thể thỏa mãn những tiêu chí đó, vì thế nếu thỏa mãn những tiêu chí cơ bản dưới đây, các bạn cũng có thể trở thành một Tester thực thụ.
Kiến thức cơ bản về Database/SQL: Tester là người có thể xử lý với các dự án làm việc với một lượng lớn dữ liệu trong nền. Dữ liệu này được lưu trữ trong các loại cơ sở dữ liệu khác nhau như Oracle, MySQL, v.v. Trong những trường hợp như vậy, việc có kỹ năng về Database/ SQL rất hữu ích!
Kiến thức cơ bản về lệnh Linux: Hầu hết các ứng dụng phần mềm như Web-Services, Database, Application Server đều được triển khai trên các máy Linux. Điều này yêu cầu các Tester phải có kiến thức về các câu lệnh Linux.
Làm việc với các công cụ Test Management:Test Management là một khía cạnh quan trọng trong vai trò hàng ngày của Tester. Nếu không có kỹ thuật Test Management thích hợp, quá trình kiểm thử phần mềm sẽ thất bại.
Làm việc với các công cụ Defect Tracking: Đây là kỹ năng cực kỳ quan trọng vì các công cụ này sẽ quản lý các lỗi đúng cách và theo dõi chúng một cách có hệ thống bằng cách sử dụng các công cụ như QC, Bugzilla, Jira, v.v.
Làm việc với các công cụ Automation: Các công cụ tự động hóa như Selenium, Ranorex và Cucumber là điều cần thiết cơ bản khi trở thành một người Tester bất kỳ không chỉ Software Tester.
Kỹ năng mềm
Kỹ năng phân tích: Bất kỳ người Tester giỏi nào cũng có điểm mạnh là kỹ năng phân tích tuyệt vời. Chúng cho phép bạn chia nhỏ một hệ thống phần mềm phức tạp thành các đơn vị nhỏ hơn để hiểu rõ hơn về từng yếu tố riêng lẻ.
Kỹ năng giao tiếp: Khi làm việc trong một dự án hợp tác, kỹ năng giao tiếp tốt có thể giúp ích rất nhiều khi chuyển tiếp thông tin và cung cấp báo cáo về các bài kiểm tra bạn đã làm.
Kỹ năng tổ chức và quản lý thời gian: Software Tester đôi khi có thể trở thành một vị trí với nhiều khó khăn. Có thể quản lý hiệu quả khối lượng công việc hiệu quả trong thời gian ngắn đồng thời có thể mang lại lợi ích cho team Tester là một điều không hề đơn giản.
Phân loại Software Tester
Có rất nhiều các phương pháp testing nhưng chỉ có một vài phương pháp tiêu biểu được các Tester thường xuyên sử dụng vì nhiều lợi ích khác nhau. Các phương pháp Kiểm thử Phần mềm được liệt kê dưới đây được xem là các phương pháp cơ bản trong testing.
Kiểm tra chức năng (Functional Testing)
Kiểm tra phi chức năng/Kiểm tra hiệu suất (Non-Functional Testing)
Trong phương pháp Non-Functional Testing, còn có những phương pháp với chức năng chi tiết hơn như:
Performance
Endurance
Load
Volume
Scalability
Usability
Maintenance Testing
Trong phương pháp Maintenance Testing, còn có những phương pháp với chức năng chi tiết hơn như:
Regression
Maintenance
Các chứng chỉ trong ngành Tester là gì?
Trong tương lai, nếu bạn nào có định hướng đi theo con đường sự nghiệp của một Tester thì ngoài việc nên bổ sung các kiến thức cần thiết trong ngành mà còn nên sở hữu một hoặc nhiều các chứng chỉ dưới đây để nâng cao level của mình nhé!
Các chứng nhận đảm bảo chất lượng ngành Kiểm thử phần mềm (tên chứng nhận – nơi cấp)
CMST – Viện đảm bảo chất lượng.
CTM/CSTP/CATE – Viện quốc tế về kiểm thử phần mềm.
Công việc IT Helpdesk có thể là một công việc tuyệt vời để bắt đầu dấn thân vào ngành IT, hiện đang được nhiều bạn trẻ CNTT quan tâm tìm hiểu. Vậy phạm vi công việc IT Helpdesk là gì, có quá rộng? Nếu theo nghề này thì có cơ hội thăng tiến hay phát triển đến đâu? Hậu dịch tìm việc làm IT Helpdesk liệu có quá khó? Hãy cùng TopDev điểm qua các thông tin quan trọng như mô tả công việc, kĩ năng cần có và cần chuẩn bị kiến thức như thế nào về vị trí IT đang hot này.
IT Helpdesk là gì?
IT Helpdesk là một bộ phận trong tổ chức có nhiệm vụ giải đáp và tư vấn giải pháp về các vấn đề liên quan đến kỹ thuật/ công nghệ về sản phẩm của tổ chức cho end-user. Đa số các công ty IT đều có bộ phận helpdesk để giải đáp và hỗ trợ người dùng. Phần tư vấn này sẽ được truyền tải qua email, điện thoại, website hoặc chatbot,…
Ngoài ra, sẽ có bộ phận internal helpdesk (helpdesk nội bộ) làm các tác vụ tương vụ, nhưng sẽ hỗ trợ chỉ cho đội ngũ nhân viên trong công ty. Vị trí helpdesk chuẩn sẽ dùng một đầu contact point duy nhất để hỗ trợ khách hàng.
Vai trò của vị trí này là phụ trách phối hợp ăn ý với các bộ phận liên quan như Technical để có thể hỗ trợ và giúp đỡ khách hàng giải quyết những vấn đề lỗi kỹ thuật, hỏng hóc,… một cách nhanh chóng và hiệu quả cao. Tiến hành theo dõi và kiểm tra hệ thống liên tục và xuyên suốt trong quá trình sử dụng để đảm bảo rằng việc bảo trì và khắc phục sự cố luôn được xử lý kịp thời và nhanh chóng.
Phân biệt IT Helpdesk và IT Support
Phần này hoàn toàn phụ thuộc vào quy mô tổ chức, loại hình dịch vụ/ sản phẩm cung như quy mô của đội IT – Technical của mỗi công ty. Thật ra không có một định nghĩa đúng hay sai về sự khác nhau của 2 vị trí này, do bản chất nó đều giống nhau. Bài viết này TopDev xin nêu tổng quát công việc và vai trò của IT Helpdesk như IT Support tại đa số mô hình các doanh nghiệp tại Việt Nam.
Công việc của IT Helpdesk là gì?
Đây cũng không phải ngoại lệ: mỗi tổ chức công ty sẽ có một scope of work – công việc cho IT Helpdesk hoàn toàn khác nhau. Chưa kể là internal IT helpdesk (helpdesk nội bộ) hay IT Helpdesk cho end-user.
IT Helpdesk thường sẽ giải quyết troubleshooting các vấn đề IT và kỹ thuật nói chung. Vị trí sẽ giúp doanh nghiệp đảm bảo track và phát hiện kịp thời các vấn đề tiềm ẩn của sản phẩm/ dịch vụ. Nó cũng đảm bảo được hiệu suất và chất lượng của sản phẩm/ dịch vụ nói chung.
Nhân viên IT Helpdesk có nhiệm vụ chẩn đoán và giải quyết vấn đề phần mềm và phần cứng cho người dùng. Một số vai trò và trách nhiệm của IT Helpdesk bao gồm việc thuyết trình giải pháp đến cho khách hàng doanh nghiệp – cổ đông nhà đầu tư bằng các dữ liệu họ thu thập và xử lý được về một vấn đề cụ thể, từ đó có thể đưa ra các quyết định kinh doanh, đầu tư quan trọng như phân phối, sắp xếp, lên budget và các quy trình khác.
Nhiệm vụ chính của IT Helpdesk là tạo điều kiện và hỗ trợ quy trình doanh nghiệp được vận hành mượt mà và hiệu quả thông qua sự hỗ trợ toàn diện về cả phần cứng và phần mềm. Mức độ hỗ trợ này có thể linh hoạt tùy vào nhu cầu của mỗi doanh nghiệp. IT Helpdesk là cầu nối giao tiếp và trải nghiệm giữa doanh nghiệp và end-user.
Bên dưới là mô tả công việc IT Helpdesktiêu biểu của một IT Helpdesk tại doanh nghiệp Việt Nam:
Hỗ trợ khách hàng và end-user gặp trục trặc về kỹ thuật với sản phẩm. Thường 2 bên sẽ giao tiếp qua điện thoại hoặc email.
Áp dụng các kỹ thuật chẩn đoán và giải quyết vấn đề để xử lý sự cố qua phone, video call, live chat hoặc gặp mặt trực tiếp.
Nói chuyện với khách hàng trực tiếp về sự cố và làm việc nội bộ/ team để cùng xử lý vấn đề
Xác định giải pháp hiệu quả và trình bày / thuyết trình giải pháp cho user cũng như nội bộ để xử lý
Thu thập và ghi lại tiến độ xử lý, tình hình và chất lượng, và để làm việc nội bộ và cập nhật các phần xử lý và fix vấn đề
Thu thập và ghi lại các phản hồi cũng như phàn nàn từ khách hàng
Đề xuất giải pháp pháp và cách xử lý vấn đề trong tương lai
Hướng dẫn end-user sử dụng hệ thống và chương trình thành thạo
Back-up dữ liệu, cập nhật và duy trì network
Các nhiệm vụ liên quan đến Bảo hành, sửa chữa máy.
Kỹ năng cần có để trở thành một IT Helpdesk
Làm việc như một IT Helpdesk hoặc vị trí support là một công việc một bàn trợ giúp hay là một vai trò hỗ trợ là một cách tuyệt vời để được khai thác và phát triển cốt lõi của doanh nghiệp: phía khách hàng và phía sản phẩm. Trong một công việc IT Helpdesk, bạn có thể kết nối với khách hàng/ end-user, hiểu được trải nghiệm của họ với công ty của bạn, và hiểu về sản phẩm từ trong ra ngoài. Vì thế để trở thành một IT Helpdesk giỏi, bạn cần phải trau dồi những kỹ năng dưới đây để thực sự tiến xa trong nghề.
IT helpdesk cần học gì?
Công nghệ thông tin luôn cập nhật và thay đổi từng ngày. Nên để trở thành một nhân viên IT Helpdesk giỏi, bạn phải không ngừng học hỏi, sáng tạo, nâng cao kỹ năng nghiệp vụ và làm mới mình để có thể trụ vững với nghề này.
Vì đây là công việc sẽ hỗ trợ khá nhiều các vấn đề liên quan đến CNTT nên việc người làm việc ở vị trí cần có những kiến thức từ cơ bản đến chuyên sâu về hệ thống mạng network, server (như Windows, CentOS) và phần cứng máy tính là cần thiết.
Am hiểu quy trình làm việc gồm tiếp nhận, hỗ trợ xử lý sự cố và cung ứng dịch vụ IT cho người dùng.
Nắm vững các thông tin liên quan đến việc vận hành hệ thống của công ty. Đây là một trong những yếu tố quan trọng để các nhân viên IT Helpdesk có thể hỗ trợ, tư vấn cũng như giải đáp thắc mắc cho người dùng một cách nhanh nhất, phù hợp nhất.
Cũng như các vị trí khác trong ngành CNTT, IT Helpdesk cũng nên có khả năng đọc hiểu tiếng Anh để dễ dàng hơn cho bản thân trong quá trình đọc và xử lý tài liệu nước ngoài.
Luôn cập nhật những thông tin, kiến thức, xu hướng mới cũng như chia sẻ chúng với khách hàng và đồng nghiệp.
Theo khảo sát về các kỹ năng IT Helpdesk đang được săn đón của Zippia 2020
Ngay khi nhận được vấn đề, bạn cần phải hỏi đúng câu hỏi, và thu thập đúng dữ liệu để thu hẹp khoảng cách giải quyết vấn đề để nhanh chóng ra giải pháp. Quan trọng là bạn không bỏ qua bất cứ tình tiết nhỏ nào để tìm ra được cốt lõi vấn đề. Vì nhiệm vụ chính của một IT Helpdesk chính là hỗ trợ người dùng xử lý và giải quyết các vấn đề liên quan đến kỹ thuật, máy tính, phần mềm, mạng,… nên bắt buộc bạn phải có kỹ năng phát hiện ra các sự cố, vấn đề và nhanh chóng đưa ra những hướng giải quyết chúng. Bạn phải là người chủ động trong việc xử lý các sự cố này.
“Soft-skill is key” – Một vị trí IT yêu cầu nhiều Kỹ năng mềm
Kỹ năng giao tiếp chuyên nghiệp
Một nhân viên IT Helpdesk cần có khả năng giao tiếp tốt hơn so với các vị trí IT thông thường khác. IT Helpdesk là người xử lý vấn đề nội bộ, hoặc là người truyền tải thông tin giải pháp đến khách hàng. Nghe khá giống tư vấn viên bảo hiểm, nhưng nghĩa đen mà nói thì IT Helpdesk sẽ cần có phong thái như thế: lắng nghe vấn đề, cung cấp giải pháp xử lý – theo một cách dễ theo nhất. Nhiều IT Helpdesk giỏi về chuyên môn, xử lý vấn đề nhưng lại thất bại ở khâu truyền tải đến khách hàng / đồng đội. Phần này bạn cũng cần phải khéo léo, kỹ năng giao tiếp ở đây là truyền đạt minh bạch đầy đủ nhưng cũng theo một cách dễ nghe – dễ chấp nhận, thì khách hàng / đồng đội mới follow giải pháp của bạn được.
Có cách tiếp cận vấn đề đa chiều
Công việc support này có thể khá khó với nhiều bạn, do cần nhiều sự kiên nhẫn và “bình tĩnh” nhìn nhận vấn đề, tuy nhiên, bạn không được có cái nhìn quá tiêu cực/ xấu về khách hàng hoặc đồng đội. Dù cho tình hình có trở xấu hay không thể đồng thuận, thì người nắm vị trí này phải là người tỉnh táo – phải giữ logic và tập trung vào việc giải quyết được vấn đề mới là quan trọng nhất. Khi có gió đừng nản lòng – Đừng than thở vấn đề trở nên quá tay, mà hãy vững vàng tìm giải pháp trước – đó là mục đích tại sao bạn ở vị trí này.
Tinh thần đồng đội – teamwork cao
IT Helpdesk sẽ không chỉ thực hiện mọi thứ một mình, đồng đội và các ban nội bộ cũng là một phần trong công việc của bạn. Workload và tình hình làm việc của teammate là cái đáng lưu tâm, bạn cần hiểu rõ họ đang làm gì và tốn bao nhiêu thời gian, và khi nào thì có thể hỏi nhờ support khi cần. Vì biết đâu có những trường hợp gấp rút ngẫu nhiên bạn chưa kịp chuẩn bị, thì teammate của bạn có thể hỗ trợ cùng bạn xử lý hay không.
Kỹ năng thuyết trình
Với tư cách là một nhân viên IT Helpdesk chuyên nghiệp, bạn phải trang bị cho mình kỹ năng thuyết trình để có thể trình bày, giải thích cho khách hàng hiểu những sự cố, vấn đề mà họ đang gặp phải và hướng dẫn cách khắc phục chúng. Ngoài ra bạn cũng có thể thuyết trình, báo cáo một cách độc lập trong buổi họp mà không gặp phải những va vấp nào.
Có niềm tin vào sản phẩm
Một IT Helpdesk giỏi là phải hiểu sâu và tường tận về sản phẩm của bạn đang support. Bạn cũng cần rèn dũa cho mình Mindset của một Product Owner thì mới nhanh tác chiến khi có sự cố xảy ra. Hãy luôn tò mò, đặt câu hỏi về những thứ nhỏ, và hiểu rõ cách thức hoạt động của product, chứ không chỉ cách fix nó khi có vấn đề. Chính việc bạn tin và hiểu rõ sản phẩm cũng sẽ thể hiện rõ và mang lại cảm giác tích cực khi bạn giao tiếp và nói chuyện với khách hàng / đồng đội.
“Chất hơn lượng”
Khi bạn có một danh sách nhiều thứ cần làm, và biết rằng sẽ có nhiều thứ khác sắp tới nữa, thường sẽ có xu hướng giải quyết càng nhiều càng tốt chứ không thật sự giải quyết việc ngay. Quan trọng là phải tập trung xử lý tốt và chất lượng vấn đề, hơn là giả quyết cho đủ số lượng mới đảm bảo được hiệu suất công việc và trải nghiệm khách hàng tốt.
Chăm sóc và tôn trọng khách hàng/ end-user
Đây là vị trí để hiểu được khó khăn của khách hàng và tận dụng những nguồn lực, kiến thức và kinh nghiệm của họ để cung cấp những giải pháp tối ưu nhất cho end-user. Cần có tầm nhìn xa hơn chỉ là các tương tác 1:1 thông thường với khách hàng để giải quyết các vấn đề và từ đó giúp được nhiều khách hàng hơn nữa.
Cơ hội việc làm và mức lương IT Helpdesk
Thu thập thông tin và các đóng góp phản hồi của khách hàng là công việc khá quan trọng, qua những thông tin nhận xét về sản phẩm dịch vụ công ty sẽ dễ dàng hơn trong việc rà soát, cải tiến và nâng cao chất lượng của sản phẩm dịch vụ hơn đồng thời phải thường xuyên chăm sóc và quan tâm tới khách hàng sử dụng sản phẩm dịch vụ của công ty. Mức lương của một IT Helpdesk hiện tại sẽ dao động trong khoảng: 360$/tháng.
Trở thành IT Helpdesk là một chuyện, để một bạn fresher mới ra trường có được vị trí Helpdesk ổn cũng không dễ. Nhưng đừng bi quan quá, vì có một fact nhỏ: Trong khi làm nghề IT Helpdesk, khi bạn phải tiếp cận, học hiểu và xử lý nhiều thứ vấn đề khác nhau thì cũng có thể xem là cơ hội để tìm hiểu kĩ hơn về khả năng và công việc mình thật sự thích trong mảng là gì hoặc một ngách để xây dựng sự nghiệp. Nếu bạn có kinh nghiệm làm việc inhouse cho một công ty, hoặc làm remote, điều này có thể thúc đẩy bạn khám phá các lựa chọn nghề nghiệp như:
Network Administration: Khi bạn đã có kiến thức kinh nghiệm cộng với sự nâng cấp bản thân với các bằng cấp về network như CCNA, CCNP… thì không khó để bạn chuyển sang vị trí này.
Database Administrators: Hiện tại trên thị trường công ty công nghệ Việt Nam không ít Database administrators đi lên từ kinh nghiệm IT Helpdesk và học hỏi thêm sâu về database.
IT Security Specialists: Làm trong bộ phận Helpdesk là cơ hội để bạn tiếp xúc học hỏi các chuyên gia, nên nếu bạn chịu khó học thêm chuyên sâu về các kỹ thuật này thì vị trí này hoàn toàn khả thi.
Helpdesk Technician Manager: Sau khi đã có lượng kinh nghiệm đủ lâu kèm với khả năng leadership và lên chiến lược, bạn có thể tiến lên vị trí Manage.
Có rất nhiều quan điểm sai lầm về IT Helpdesk. Nhiều người thậm chí không biết được nhiệm vụ chính của một IT Helpdesk là gì và nghĩ họ là superman, làm được mọi thứ. Các sai lầm có thể kể đến:
IT Helpdesk biết tất cả mọi thứ liên quan đến IT: dù là những người được user liên lạc đầu tiên khi có sự cố trong quá trình làm việc với máy tính nhưng Helpdesk không phải gì cũng biết. Họ có thể biết rất rõ những sự cố hay yêu cầu liên quan đến máy tính của bạn, hoặc network của bạn có vấn đề gì nhưng nhiều vấn đề họ cần phải chuyển cho các bộ phận khác xử lý. Ví dụ những vấn đề liên quan đến các ứng dụng, hoặc server…
Không có cơ hội phát triển: như trên đã đề cập, rất nhiều cơ hội phát triển cho người làm IT Helpdesk, miễn là có ý cầu tiến và luôn tìm mọi cơ hội để học hỏi
Không tìm được việc gì khác mới làm IT Helpdesk: làm gì cũng cần kỹ năng, kinh nghiệm và Helpdesk cũng vậy. IT Helpdesk là bộ phận vô cùng quan trọng trong IT.
IT Helpdesk đụng đâu xử lý đó, không cần quy trình tiêu chuẩn gì: điều này hoàn toàn sai. Helpdesk hay support team là một bộ phận của IT và có những quy tắc, tiêu chuẩn hay framework cần phải tuân theo như ITIL (Information Technology Infrastructure Library) cùng các tiêu chuẩn khác.
Làm Helpdesk là sửa cả điện nước, điện thoại các kiểu: chuyện này là khá phổ biến trong các công ty nhỏ. Thực tế IT Helpdesk không có chức năng như vậy và việc nhờ họ làm thì cũng giống bạn nhờ ai đó trong công ty làm việc gì đó ngoài chuyên môn. Họ có thể giúp nhưng đó không phải là nhiệm vụ của họ.
HelpDesk Certificate: Networking Essentials by Microsoft (edX) Kháo học được thiết kế để giới thiệu các thiết lập mạng cho người mới vào ngành IT HelpDesk
Bài viết được sự cho phép của tác giả Trần Anh Tuấn
Khi các bạn code giao diện cho một dự án nào đó chẳng hạn, các bạn sẽ thấy rằng để làm khoảng cách giữa các phần tử thì sẽ có nhiều cách như margin hoặc padding hay gọi chung là spacing. Tuy nhiên mình thấy nhiều bạn mới học thì hay bị rối giữa việc dùng 2 thứ này, hôm nay mình lại tiếp tục research tìm nội dung về nó để viết cho các bạn, hi vọng sẽ giúp ích được cho các bạn phần nào trong việc cải thiện kiến thức hơn, thông suốt hơn về spacing để có thể làm chủ việc code tốt hơn.
Các loại spacing
Như mình đã nói ở trên thì trong CSS có 2 loại spacing đó chính là outer-space và inner-space mà chúng ta hay gặp. Trong bài viết này mình gọi tạm là outer và inner cho dễ hiểu nhé. Ví dụ như hình dưới đây khoảng trống bên ngoài là outer và bên trong là inner.
Ví dụ ở trên có class là element đi thì chúng ta có thể có CSS đơn giản như này với inner là padding và outer là margin. Đơn giản đúng không nào ?
.element {padding:20px;margin-bottom:20px;}
Tuy nhiên không chỉ đơn giản như vậy đâu, nó còn nhiều trường hợp khác thú vị lắm, chúng ta sẽ cùng nhau tìm hiểu tiếp dưới đây nhé.MarginMargin thường được sử dụng khi các bạn muốn tạo khoảng cách giữa phần tử này so với các phần tử khác. Như ví dụ ở trên thì mình có dùng margin-bottom: 20px để tạo ra khoảng cách so với phần tử ở dưới.Chắc các bạn cũng đã biết là margin có thể sử dụng ở 4 hướng (top right bottom left), và chúng ta nên nắm rõ những thứ cơ bản này để có thể áp dụng chúng tốt vào trong dự án thực tế được.Vấn đề margin collapseHiểu đơn giản là margin collapse xảy ra khi chúng ta có 2 phần tử nằm hàng dọc và có margin và một trong số chúng có margin lớn hơn cái còn lại. Trong trường hợp này thằng nào có margin lớn hơn sẽ được sử dụng và thằng còn lại sẽ bị bỏ qua. Các bạn xem hình nhé.Các bạn thấy phần tử ở trên có margin-bottom: 50px và thằng ở dưới có margin-top: 30px thì khoảng cách lúc này không phải là 80px như các bạn nghĩ đâu mà là 50px do thằng ở trên có margin lớn hơn, và điều đó tạo nên một thứ chính là margin collapse.Và để giải quyết vấn đề này thì người ta khuyến khích chỉ sử dụng một một hướng mà thôi ví dụ các bạn muốn khoảng cách giữa chúng là 80px thì chỉ cần dùng margin-bottom: 80px là đủ, tuy nhiên nếu code .element {margin-bottom: 80px} thì cái cuối cùng sẽ có khoảng trống dư thừa cho nên để fix cái này chúng ta sẽ dùng :not(:last-child)
.element:not(:last-child){margin-bottom:80px;}
Một ví dụ khác nữa cũng khá thú vị đó là mối quan hệ giữa phần tử cha và con bên trong. Giả sử ta có HTML và CSS như sau
Các bạn thấy rằng phần tử con có margin: 50px 0 nhưng lại không cách ra phía trên so với phần tử cha bao ngoài, đó là vì margin collapse của thằng cha gây ảnh hưởng lên thằng con. Để giải quyết trường hợp này thì chúng ta có thể CSS cho thằng con thành display: inline-block hoặc hay hơn là thiết lập cho thằng cha padding-top: 50px chẳng hạn là ok.Negative MarginTức là sử dụng số âm trong giá trị của margin. Nó thật sự hữu ích trong nhiều trường hợp giả sử mình có cấu trúc giao diện như hình với padding bao quanh, làm cho phần tử con bị thu vào.Nhưng cái chúng ta muốn là phần tử con rộng 100% của phần tử cha nhưng không được bỏ padding của phần tử cha đi thì phải làm sao. Lúc này negative margin sẽ là cứu tinh cho chuyện này, do phần tử cha có padding: 1rem nó đẩy phần tử con vào, cho nên lúc này ở phần tử con mình cho margin số âm top left và right giá trị ngược lại 1rem là -1rem để nó giãn ra 100% của phần tử cha và dính trên cùng.
Padding – Inner SpacingNhư mình đã nói từ lúc đầu thì padding hay còn gọi là inner bên trong phần tử. Nó thì được sử dụng ở nhiều trường hợp lắm. Ví dụ như hình dưới đây minh hoạ khi chúng ta dùng padding cho thẻ a để phạm vi click của thẻ a được mở rộng hơnPadding không hoạt độngCó một điều quan trọng là padding top và padding-bottom sẽ không hoạt động nếu phần tử các bạn đang làm có display: inline như là thẻ <span> hay là thẻ <a> . Nếu padding được thêm vào nó sẽ không ảnh hưởng tới phần tử. Để giải quyết vấn đề này thì các bạn có thể dùng thuộc tính display với giá trị khác như là inline-block hoặc block là oke thôi.
Một vài ví dụ thực tếXử lý với margin bottomGiả sử chúng ta có một layout như thế này, và mỗi phần tử đều có margin-bottom: 20px và các bạn thấy rằng phần tử cuối cũng có như vậy là sai vì ở đây mình chỉ muốn khoảng cách giữa các phần tử mà thôi chứ cái cuối cùng không có.Vậy làm sao để giải quyết trường hợp này ? Chúng ta sẽ dùng :not(:last-child) như sau
.element:not(:last-child){margin-bottom:20px;}
Tuy nhiên cách này chỉ chạy đúng khi hiển thị một cột, nhưng nếu giao diện là 2 cột thì lúc này nó không hề đúng, ở đây là cái số 4 vẫn có margin bottomVà một cách tốt nhất để giải quyết nó là ở thằng cha bọc ngoài cho margin-bottom số âm bằng chính margin bottom của thằng con như sau
.wrapper {margin-bottom:-20px;}
Card ComponentVí dụ chúng ta có hình như thế này, làm sao nhìn vào một một giao diện đơn giản như này thì chúng ta phân biệt được ở đâu xài margin, ở đâu xài padding.Và hình dưới đây sẽ cho bạn thấy, bạn có nghĩ giống mình không nào?
Tuy nhiên kết qủa lại ra không như mong đợi, vì do padding của content bao ngoài làm cái border bị thụt vào bên trong như hìnhLúc này ta nhanh trí nghĩ ra cách dùng margin số âm cho nó kéo ra lại như mình đã trình bày trước đó như sau
Nhưng được cái border nhưng content lại dính sát lề, hết lỗi này đến lỗi khácĐể giải quyết vấn đề này, các bạn chỉ cần thêm padding left và right vào card__meta là sẽ được kết quả tuyệt vời thôi.
Tạm kết về spacingHi vọng với những kiến thức cơ bản nhưng bổ ích này sẽ giúp ích cho các bạn phần nào cải thiện kiến thức nhé. Đừng quên xem demo ở đây nhé.Bài viết được tham khảo và viết lại dựa trên bài gốc của tác giả ishadeedBài viết gốc được đăng tải tại evondev.com
Như vậy ở bài 3 các bạn đã biết tạo một Điện thoại giả lập trong Android rồi. Bài này Tui chỉ sơ qua cách sử dụng một số tính năng thường dùng (lưu ý là điện thoại thật như thế nào thì điện thoại giả lập y xì như vậy):
Khi viết phần mềm Mobile, ta cũng thường có các phần mềm có giao diện nằm ngang, máy ảo cũng hỗ trợ xoay ngang màn hình cho chúng ta test (Nhấn vào xoay màn hình):
Với Sinh Viên, thường phải làm báo cáo đồ án, thường phải chụp lại màn hình, thì nhớ bấm vào biểu tượng chụp hình ở trên (không cần dùng công cụ nào khác) nó sẽ đẹp.
Bây giờ ta vào cấu hình mở rộng (nút … cuối cùng đó):
Location: Kiểm thử về định vị, ta có thể giả lập điện thoại di chuyển bất kỳ vị trí nào trong hệ trục kinh độ vĩ độ. Chức năng này được áp dụng rất nhiều trong Google Map, GPS.
Display: Chỉnh xem các cách thức hiển thị màn hình điện thoại
Cellular: Kiểm thử về sóng điện thoại.
Battery: Kiểm thử về pin điện thoại.
Phone: Kiểm thử về telephony như nghe, gọi, nhắn tin trong máy ảo.
Finger Print: Kiểm thử cảm biến vân tay.
Virtual sensors: Kiểm các loại cảm biến như: gia tốc, con quay hồi chuyển, ánh sáng, tiệm cận, áp suất,…
Help: Hướng dẫn các phím tắt sử dụng trong máy ảo.
… và nhiều tính năng khác
Việc sử dụng thành thạo các chức năng trong máy ảo giúp ích ta rất nhiều trong quá trình kiểm thử phần mềm và đặt biệt giảm thiểu chi phí đầu tư ban đầu rất nhiều vì ta không phải mua điện thoại thật mà vẫn có thể kiểm thử được phần mềm.
Các bạn thử 2 tính năng của điện thoại ảo sau nhé: Gọi điện thoại, nhắn tin. Nó hoạt động y chang điện thoại thật, có tính năng này chúng ta có thể test phần mềm mà không cần điện thoại thật, đỡ tốn tiền. Khi nào vào Công ty thì họ phát cho mỗi đứa 1 cái phone mà làm.
Ta vào mục Phone, nhập dữ liệu rồi nhấn “SEND MESSAGE”–> thấy kết quả nó gửi luôn qua điện thoại nha.
Ta có thể nhấn vào “CALL DEVICE” để gọi điện thoại.
Như vậy Tui đã trình bày sơ qua cách thức sử dụng Điện thoại giả lập, bài sau chúng ta sẽ chạy phần mềm “HelloWorld” thần thánh lên điện thoại giả lập này.
Chúng ta ắt hẳn đều đã có kiến thức về lập trình hướng đối tượng, nhưng việc vận dụng nó cách thuần thục và hợp lí thì không phải ai cũng biết. SOLID xuất hiện như là một trong những định hướng giúp các developer thiết kế hệ thống và phát triển phần mềm chất lượng hơn: code chạy tốt và trong sáng, dễ dàng mở rộng, dễ bảo trì trong tương lai, … SOLID là một trong những nguyên lí phát triển phần mềm sẽ được hỏi trong hầu hết các buổi phỏng vấn việc làm, nó cũng là nguyên lí mà tất cả các dev chúng ta nên biết và áp dụng nếu muốn cải thiện kĩ năng của bản thân. SOLID gồm 5 nguyên lí chính:
Single Responsibility principle.
Open-Closed principle.
Liskov substitution principle.
Interface segregation principle.
Dependency inversion principle.
Bạn có thể tìm hiểu tổng quan về SOLID ở bài viết này. Trong bài này, mình sẽ đi sâu phân tích nguyên lí đầu tiên: Đơn nhiệm – Single responsibility principle (SRP). Bắt đầu nào!
Phát biểu: Mỗi lớp chỉ nên chịu trách nhiệm về một nhiệm vụ cụ thể nào đó mà thôi.
Nguyên tắc này nói về việc: đơn nhiệm. Để hình dung một cách đơn giản, nếu bạn là một người phát triển phần mềm, thì bạn nên tập trung vào việc viết code và các vấn đề liên quan đến phần mềm, các việc lặt vặt như lau dọn văn phòng, đóng mở cửa văn phòng .v.v.. thì hãy để cho người khác làm ( ví dụ như công ty sẽ thuê người lao công để làm các việc này). Phân công công việc theo chuyên môn như thế vừa giúp bạn tập trung vào công việc để đạt được hiệu quả cao, vừa giúp văn phòng sạch sẽ hơn (vì người lao công sẽ lau dọn sạch hơn bạn ^^).
Nguyên lí này không chỉ áp dụng cho lĩnh vực IT và cho hầu hết mọi điều trong cuộc sống: mọi thứ chỉ nên tập trung vào chuyên môn của mình, nếu bạn ôm đồm quá nhiều việc một lúc thì kết quả đạt được sẽ không cao. Tấm hình sau minh hoạ cho việc này:
Hãy thử xem xét, với quỹ thời gian có hạn trong ngày, một mình bạn vừa phải làm công việc chính để có thu nhập nuôi gia đình, vừa phải lo chăm sóc con nhỏ, cho con bú … lại phải nấu nướng, giặt giũ, chăm vườn, tưới cây, … khi đó mặc dù có thể làm được nhiều việc một lúc, nhưng khả năng cao là bạn sẽ chẳng hoàn thành được tốt việc nào cả.
Nếu muốn các công việc đều được hoàn thành với hiệu suất cao, hãy thử chia nhỏ công việc ra và giao cho những thành viên khác trong nhà. Bạn tập trung đi làm kiếm tiền, quần áo dùng máy giặt để giặt, vườn cây thì thuê nhân viên vệ sinh dọn dẹp và chăm sóc, … Như vậy chắc chắc các công việc khác nhau đều được hoàn thành với một hiệu quả tối đa.
Áp dụng trong lập trình như thế nào?
Trong phần mềm cũng vậy, khi bạn thiết kế một phần mềm, để cho việc bảo trì và mở rộng dễ dàng sau này, bạn nên thiết kế theo hướng đơn nhiệm: mỗi lớp chỉ nên chịu trách nhiệm về một tính năng duy nhất. Nếu xuất hiện đoạn code mà không thuộc về trách nhiệm của lớp, thì nên tách đoạn code đó ra một lớp xử lí khác.
Hãy xem một ví dụ sau, chúng ta có một lớp học sinh với các hàm đơn giản như lấy thông tin học sinh, nộp đơn học bổng, …
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
classStudent
{
privatestring name;
privateintage;
string getStudentInfoJson()
{
returnjson_encode( array(name, age) );
}
string getStudentInfoHtml()
{
return"<span> Name: "+ name + ", age: "+ age + "</span>";
Nếu thiết kế lớp học sinh như vậy thì đã ổn chưa nhỉ?
Tất nhiên, đoạn code trên có thể chạy đúng yêu cầu của phần mềm. Thế nhưng! Dường như lớp Student đang ôm đồm quá nhiều việc: cung cấp thông tin cá nhân, định dạng cấu trúc của thông tin cá nhân, ghi log, apply xin học bổng ..v.v.. Điều này vi phạm quy tắc đơn nhiệm. Về mặt logic xử lí, có một số câu hỏi mà chúng ta có thể thắc mắc: học sinh thì có nhiệm vụ gì mà phải đi định dạng dữ liệu nhỉ? Sau này nếu muốn định dạng ghi log từ file thành DB thì như thế nào? Đổi định dạng format thông tin log thì sẽ sửa code làm sao? …
Áp dụng quy tắc đơn nhiệm của SOLID, sẽ tốt hơn nếu ta xây dựng thêm các lớp riêng biệt làm nhiệm vụ format data và ghi log. Chúng ta sẽ thực hiện refactor lại đoạn code ở trên, code mới trông sẽ như thế này:
Như bạn thấy đó, việc tách bạch nhiệm vụ giữa các lớp khiến code trở nên rành mạch, dễ đọc, dễ bảo trì và mở rộng hơn rất nhiều. Sẽ dễ dàng để mở rộng ra các cách format mới sau này, hoặc cũng rất dễ để đáp ứng yêu cầu về nhiều cách xuất log hơn nữa khi chương trình được mở rộng.
Kết luận
Nguyên lí này trông có vẻ đơn giản, nhưng thực ra cần rất nhiều thời gian và luyện tập để có thể sử dụng thành thục nguyên lý này. Tuy nhiên cũng không nên vội vàng, hãy để thời gian để bạn “ngấm” được ý nghĩa thực sự của nguyên lý này.
Về mặt kĩ thuật mà nói, đoạn code trên vẫn còn có thể trở nên tốt hơn nữa nếu chúng ta áp dụng các kĩ thuật khác trong SOLID, nhưng mình chỉ đang muốn nhấn mạnh ở đây tính đơn nhiệm của chương trình.
Chúng ta mới chỉ áp dụng một quy tắc đầu tiên của SOLID – quy tắc đơn nhiệm – vào thiết kế phần mềm thì code đã trở nên trong sáng và hữu dụng hơn rất nhiều. Có thể dễ dàng hình dung được, nếu các anh em developer chúng ta đều nắm vững và áp dụng các quy tắc này, thì phần mềm của chúng ta sẽ tốt lên rất nhiều.
C++ là ngôn ngữ mạnh mẽ nhờ tính linh hoạt, gần gũi với ngôn ngữ máy. Bên cạnh đó còn có khả năng lập trình dựa trên mẫu có sẵn (template). Sức mạnh của C++ nằm ở STL (Standard Template Library) – một thư viện template dành cho C++ tổng hợp các cấu trúc dữ liệu cũng như giải thuật và các vector trong C++ được xây dựng một cách tổng quát cho nhiều trường hợp.
Bộ thư viện này thực hiện toàn bộ các hoạt động ra vào của dữ liệu (iostream), quản lý mảng (vector) và hầu hết các tính năng của các cấu trúc dữ liệu cơ bản như (stack, queue, map, set…). Ngoài ra, STL còn bao gồm các thuật toán cơ bản: tính tổng, tìm min, max, sắp xếp (với đa dạng thuật toán sắp xếp), thay thế các phần tử, tìm kiếm (tìm kiếm bình thường và tìm kiếm dười dạng nhị phân). Toàn bộ những tính năng trên đều được cung cấp dưới dạng template nên việc sử dụng chúng cực kỳ tiện lợi và phù hợp với nhiều tình huống. Nhờ vậy, STL làm cho ngôn ngữ C++ trở nên “xịn xò” hơn.
Nhưng nói đến STL thì sẽ là bài tập rất dài nên hôm nay mình sẽ chỉ đề cập đến vector thôi.
Vậy Vector trong C++ là gì?
Không giống như array (mảng), chỉ một số giá trị nhất định có thể được lưu trữ dưới một tên biến duy nhất. Vector trong C++ giống dynamic array (mảng động) nhưng có khả năng tự động thay đổi kích thước khi một phần tử được chèn hoặc xóa tùy thuộc vào nhu cầu của tác vụ được thực thi, với việc lưu trữ của chúng sẽ được vùng chứa tự động xử lý. Các phần tử vector được đặt trong contiguous storage (bộ nhớ liền kề) để chúng có thể được truy cập và duyệt qua bằng cách sử dụng iterator.
Vì sao nên dùng Vector
Nếu bạn đã phát chán việc quản lý mảng động qua con trỏ trong C++ hay chán phải tạo mảng mới, copy các phần tử qua mảng mới, rồi lại xóa mảng cũ mỗi khi bạn muốn resize kích thước mảng động trong C++. Thật thừa thải, tốn thời gian và đó là thời điểm ta nhận ra C++ còn có vector.
Một số điểm nổi trội của Vector
– Bạn không cần phải khai báo kích thước của mảng ví dụ int A[100]…, vì vector có thể tự động nâng kích thước lên.
– Nếu bạn thêm 1 phần tử vào vector đã đầy rồi, thì nó sẽ tự động tăng kích thước của nó lên để dành chỗ cho giá trị mới này.
– Vector còn giúp cho bạn biết số lượng các phần tử mà bạn đang lưu trong đó.
– Dùng số phần tử âm vẫn được trong vector ví dụ A[-6], A[-9], rất tiện trong việc cài đặt các giải thuật.
Không có vector nào không được sắp xếp trong C++. Các phần tử vector được đặt trong bộ nhớ liền kề để chúng có thể được truy cập và di chuyển qua các iterator. Trong vector, dữ liệu được chèn vào cuối. Việc chèn một phần tử vào cuối sẽ mất thời gian chênh lệch, vì đôi khi có thể cần mở rộng vector. Việc xóa phần tử cuối cùng chỉ mất thời gian không đổi vì không xảy ra thay đổi kích thước. Chèn và xóa ở đầu hoặc giữa vector là tuyến tính theo thời gian.
Các vector được lưu trữ trong C++ như thế nào?
Để tạo một vector, bạn cần thực hiện theo cú pháp dưới đây:
Khi một biến vector rời khỏi phạm vi đoạn code mà chương trình đang chạy, nó sẽ tự động giải phóng những phần bộ nhớ mà nó kiểm soát (nếu cần). Điều này không chỉ tiện dụng (vì bạn không cần tự tay giải phóng bộ nhớ), mà nó còn giúp ngăn ngừa lỗi rò rỉ bộ nhớ (memory leaks).
Xem hàm dưới đây:
void doSomething(bool earlyExit)
{
int *array = newint[3]{ 1, 3, 2 };
if (earlyExit) // thoát khỏi hàmreturn;
delete[] array; // trường hợp hàm thoát sớm, array sẽ không bị xóa
}
Nếu biến earlyExit được gán là true, mảng array sẽ không bao giờ được giải phóng, và bộ nhớ sẽ bị rò rỉ.
Tuy nhiên, nếu biến array là một vector, điều này sẽ không xảy ra, bởi vì bộ nhớ sẽ được giải phóng ngay sau khi biến array nằm ngoài phạm vi đoạn code mà chương trình đang chạy (bất kể hàm có bị thoát ra sớm hay không). Điều này làm cho vector an toàn hơn nhiều so với việc bạn phải tự chú ý đến việc giải phóng bộ nhớ.
Vector tự ghi nhớ độ dài của mình
Không giống như mảng động được tích hợp sẵn của C++, cái mà không biết được độ dài của mảng mà nó đang trỏ tới là bao nhiêu, std::vectors tự theo dõi độ dài của chính nó. Chúng ta có thể lấy được độ dài của vector thông qua hàm size():
Tương tự với array, hàm size() sẽ trả về một giá trị thuộc kiểu nested type (kiểu dữ liệu lồng) là size_type, nó là một số nguyên không dấu.
Các hàm của Vectors trong C ++
Vector trong STL cung cấp cho chúng ta nhiều chức năng hữu ích khác nhau.
1. Modifiers
2. Iterators
3. Capacity 4. Element access
Modifiers
1. push_back(): Hàm đẩy một phần tử vào vị trí sau cùng của vector. Nếu kiểu của đối tượng được truyền dưới dạng tham số trong push_back() không giống với kiểu của vector thì sẽ bị ném ra.
ten-vector.push_back(ten-cua-phan-tu);
2. assign(): Nó gán một giá trị mới cho các phần tử vector bằng cách thay thế các giá trị cũ.
ten-vector.assign(int size, int value);
3. pop_back(): Hàm pop_back () được sử dụng để xóa đi phần tử cuối cùng một vector.
ten-vector.pop_back();
4. insert(): Hàm này chèn các phần tử mới vào trước phần tử trước vị trí được trỏ bởi vòng lặp. Chúng ta cũng có thể chuyển một số đối số thứ ba, đếm số lần phần tử được chèn vào trước vị trí được trỏ.
ten-vector.insert(position, value);
5. erase(): Hàm được sử dụng để xóa các phần tử tùy theo vị trí vùng chứa
ten-vector.erase(position);
ten-vector.erase(start-position, end-position);
6. emplace(): Nó mở rộng vùng chứa bằng cách chèn phần tử mới vào
ten-vector.emplace(ten-vector.position, element);
7. emplace_back(): Nó được sử dụng để chèn một phần tử mới vào vùng chứa vector, phần tử mới sẽ được thêm vào cuối vector
ten-vector.emplace_back(value);
8. swap(): Hàm được sử dụng để hoán đổi nội dung của một vector này với một vector khác cùng kiểu. Kích thước có thể khác nhau.
ten-vector-1.swap(ten-vector-2);
9. clear(): Hàm được sử dụng để loại bỏ tất cả các phần tử của vùng chứa vector.
ten-vector.clear();
Ví dụ:
/ Modifiers in vector
#include <bits/stdc++.h>
#include <vector>
using namespace std;
int main()
{
// Assign vector
vector<int> vec;
// fill the array with 12 seven times
vec.assign(7, 12);
cout << "The vector elements are: ";
for (int i = 0; i < 7; i++)
cout << vec[i] << " ";
// inserts 24 to the last position
vec.push_back(24);
int s = vec.size();
cout << "nThe last element is: " << vec[s - 1];
// prints the vector
cout << "nThe vector elements after push back are: ";
for (int i = 0; i < vec.size(); i++)
cout << vec[i] << " ";
// removes last element
vec.pop_back();
// prints the vector
cout << "nThe vector elements after pop_back are: ";
for (int i = 0; i < vec.size(); i++)
cout << vec[i] << " ";
// inserts 10 at the beginning
vec.insert(vec.begin(), 10);
cout << "nThe first element after insert command is: " << vec[0];
// removes the first element
vec.erase(vec.begin());
cout << "nThe first element after erase command is: " << vec[0];
// inserts at the beginning
vec.emplace(vec.begin(), 5);
cout << "nThe first element emplace is: " << vec[0];
// Inserts 20 at the end
vec.emplace_back(20);
s = vec.size();
cout << "nThe last element after emplace_back is: " << vec[s - 1];
// erases the vector
vec.clear();
cout << "nVector size after clear(): " << vec.size();
// two vector to perform swap
vector<int> obj1, obj2;
obj1.push_back(2);
obj1.push_back(4);
obj2.push_back(6);
obj2.push_back(8);
cout << "nnVector 1: ";
for (int i = 0; i < obj1.size(); i++)
cout << obj1[i] << " ";
cout << "nVector 2: ";
for (int i = 0; i < obj2.size(); i++)
cout << obj2[i] << " ";
// Swaps obj1 and obj2
obj1.swap(obj2);
cout << "nAfter Swap nVector 1: ";
for (int i = 0; i < obj1.size(); i++)
cout << obj1[i] << " ";
cout << "nVector 2: ";
for (int i = 0; i < obj2.size(); i++)
cout << obj2[i] << " ";
}
Output:
Bạn có thể thấy cách sử dụng các hàm thuộc nhóm Modifiers mà chúng ta đã nghiên cứu ở trên qua ví dụ thực tiễn.
Iterators
begin(): đặt iterator đến phần tử đầu tiên trong vectorten-vector.begin();
end(): đặt iterator đến sau phần tử cuối cùng trong vectorten-vector.end();
rbegin(): đặt reverse iterator (trình lặp đảo) đến phần tử cuối cùng trong vector (reverse begin). Nó di chuyển từ phần tử cuối cùng đến phần tử đầu tiên
ten-vector.rbegin();
rend(): đặt reverse iterator (trình lặp đảo) đến phần tử đầu tiên trong vector (reverse end)
ten-vector.rend();
cbegin(): đặt constant iterator (trình vòng lặp) đến phần tử đầu tiên trong vectorten-vector.cbegin();
cend(): đặt constant iterator (trình vòng lặp) đến phần tử cuối cùng trong vectorten-vector.cend();
crbegin(): đặt constant reverse iterator (trình lặp đảo liên tục) đến phần tử cuối cùng trong vector (reverse begin). Nó di chuyển từ phần tử cuối cùng đến phần tử đầu tiênten-vector.cbregin();
crend(): đặt constant reverse iterator (trình lặp đảo liên tục) đến phần tử đầu tiên trong vector (reverse end)ten-vector.crend();
Ví dụ 1:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec1;
for (int i = 1; i <= 10; i++)
vec1.push_back(i);
cout << "Understanding begin() and end() function: " << endl;
for (auto i = vec1.begin(); i != vec1.end(); ++i)
cout << *i << " ";
return 0;
}
Output:
Trong ví dụ trên, chúng ta có thể thấy cách sử dụng hàm begin() và end(). Đầu tiên, chúng ta xác định một vector là vec1, chúng đẩy lùi các giá trị trong đó từ 1 đến 10 bằng cách sử dụng vòng lặp for. Sau đó, chúng in các giá trị của các vector của chúng tôi bằng cách sử dụng vòng lặp for, chúng tôi sử dụng hàm begin() và end() để chỉ định điểm đầu và điểm cuối của vòng lặp for của chúng tôi.
Ví dụ 2:
// C++ program to illustrate the
// iterators in vector
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> g1;
for (int i = 1; i <= 5; i++)
g1.push_back(i);
cout << "Output of begin and end: ";
for (auto i = g1.begin(); i != g1.end(); ++i)
cout << *i << " ";
cout << "\nOutput of cbegin and cend: ";
for (auto i = g1.cbegin(); i != g1.cend(); ++i)
cout << *i << " ";
cout << "\nOutput of rbegin and rend: ";
for (auto ir = g1.rbegin(); ir != g1.rend(); ++ir)
cout << *ir << " ";
cout << "\nOutput of crbegin and crend : ";
for (auto ir = g1.crbegin(); ir != g1.crend(); ++ir)
cout << *ir << " ";
return 0;
}
Output:
Ví dụ 3:
// CPP program to illustrate working of crbegin()
// crend()
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
// initializing vector with values
vector<int> vect = {10, 20, 30, 40, 50};
// for loop with crbegin and crend
for (auto i = vect.crbegin(); i != vect.crend(); i++)
cout << ' ' << *i; //printing results
cout << '\n';
return 0;
}
Output:
50 40 30 20 10
Capacity
size(): hàm sẽ trả về số lượng phần tử đang được sử dụng trong vectorten-vector.size();
max_size(): hàm trả về số phần tử tối đa mà vector có thể chứaten-vector.max_size();
capacity(): hàm trả về số phần tử được cấp phát cho vector nằm trong bộ nhớten-vector.capacity();
resize(n): Hàm này thay đổi kích thước vùng chứa để nó chứa đủ n phần tử. Nếu kích thước hiện tại của vector lớn hơn n thì các phần tử phía sau sẽ bị xóa khỏi vector và ngược lại nếu kích thước hiện tại nhỏ hơn n thì các phần tử bổ sung sẽ được chèn vào phía sau vectorten-vector.resize(int n, int value);
empty(): Trả về liệu vùng chứa có trống hay không, nếu trống thì trả về True, nếu có phần tử thì trả về Falseten-vector.empty();
shrink_to_fit(): Giảm dung lượng của vùng chứa để phù hợp với kích thước của nó và hủy tất cả các phần tử vượt quá dung lượngten-vector.shrink_to_fit();
reserve(n): hàm cấp cho vector số dung lượng vừa đủ để chứa n phần tửten-vector.reserve(n);
Ví dụ:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec1;
for (int i = 1; i <= 10; i++)
vec1.push_back(i);
cout << "Size of our vector: " << vec1.size();
cout << "nCapacity of our vector: " << vec1.capacity();
cout << "nMax_Size of our vector: " << vec1.max_size();
// resizes the vector size to 4
vec1.resize(4);
// prints the vector size after resize()
cout << "nSize of our vector after resize: " << vec1.size();
// checks if the vector is empty or not
if (vec1.empty() == false)
cout << "nVector is not empty";
else
cout << "nVector is empty";
return 0;
}
Output:
Chú ý: Khi thay đổi kích thước mảng vector, các giá trị của phần tử hiện có cần giữ nguyên, thì các phần tử mới được khởi tạo bằng giá trị mặc định của kiểu dữ liệu mảng.
Chúng ta có thể thấy cách hoạt động của các hàm capacity như đã thảo luận ở trên.
Element access
at(g): Trả về một tham chiếu đến phần tử ở vị trí ‘g’ trong vectorten-vector.at(position);
data(): Trả về một con trỏ trực tiếp đến (memory array) bộ nhớ mảng được vector sử dụng bên trong để lưu trữ các phần tử thuộc sở hữu của nóten-vector.data();
front(): hàm dùng để lấy ra phần tử đầu tiên của vectorten-vector.front();
back(): hàm dùng để lấy ra phần tử cuối cùng của vectorten-vector.back();
Ví dụ:
// C++ program to illustrate the
// element accesser in vector
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> g1;
for (int i = 1; i <= 10; i++)
g1.push_back(i * 10);
cout << "\nReference operator [g] : g1[2] = " << g1[2];
cout << "\nat : g1.at(4) = " << g1.at(4);
cout << "\nfront() : g1.front() = " << g1.front();
cout << "\nback() : g1.back() = " << g1.back();
// pointer to the first element
int* pos = g1.data();
cout << "\nThe first element is " << *pos;
return 0;
}
Output:
Thực hiện nén nhiều giá trị bools
Vector còn có một thủ thuật hay ho khác là sử dụng một cài đặt đặc biệt dành cho vector kiểu bool mà nó có thể nén 8 giá trị booleans vào trong chỉ một byte (amazing!!) Quá trình này đã được cài sẵn, tất cả những gì bạn cần chỉ là sử dụng nó như một tính năng hỗ trợ khi lập trình. Thủ thuật này cũng sẽ không ảnh hưởng gì đến cách mà bạn sử dụng vector.
#include <vector>
#include <iostream>
int main()
{
std::vector<bool> array { true, false, false, true, true };
std::cout << "The length is: " << array.size() << '\n';
for (int i : array)
std::cout << i << ' ';
std::cout << '\n';
return 0;
}
Output:
The length is: 5
1 0 0 1 1
Kết
Với những cú pháp mẫu và ví dụ thực tiễn trên, chúng ta kết thúc phần tìm hiểu về vector trong C++. Tôi hy vọng bạn đã phân biệt được các hàm khác nhau của vector và nắm được cách hoạt động của từng hàm. Vì vector hỗ trợ rất tốt trong việc thao tác với mảng động, đảm bảo an toàn và dễ dàng hơn. Bạn nên sử dụng vector trong hầu hết các trường hợp đụng tới mảng động.
Có nhiều phương pháp được giới chuyên môn sử dụng để trắc nghiệm cá tính ứng viên. Từ đó, họ xem xét mối tương quan giữa các yếu tố về giá trị để đánh giá các thiên hướng. Đồng thời, khai thác tiềm năng phát triển của họ trong từng lĩnh vực tương ứng. MBTI là một trong các phương pháp được ưa chuộng nhất.
Phương pháp trắc nghiệm tính cách MBTI được nhà tuyển dụng dùng để xác định nhóm thiên hướng của các ứng viên. Điều này không những giúp lựa chọn các ứng viên phù hợp; mà còn giúp ứng viên nhận ra tố chất của bản thân mình.
Cùng TopDev tìm hiểu xem có những điều gì thú vị xoay quanh phương pháp trắc nghiệm MBTI nhé!
1. Trắc nghiệm MBTI là gì?
Trắc nghiệm tính cách MBTI (Myers-Briggs Type Indicator) là một phương pháp sử dụng hệ thống bộ câu hỏi nhằm kiểm tra tâm lý, tính cách của một cá nhân trên cơ sở các đáp án tương ứng của họ.
Thách thức được đặt ra nhằm mục đích phân tích, khám phá chiều sâu của họ trên từng khía cạnh. Bài trắc nghiệm tính cách này còn nhấn mạnh vào sự khác biệt về mặt tự nhiên. Mỗi người là mỗi một cá thể riêng biệt, không trộn lẫn với bất kỳ ai.
Từ sự nhìn nhận về bản thân thông qua MBTI, mỗi cá nhân sẽ hiểu hơn về bản thân. Đồng thời, có cơ sở để lựa chọn nghề nghiệp chính xác với nguyện vọng.
MBTI ngày này được phát triển dựa vào nền tảng tâm lý học. Những học thuyết khoa học được vận dụng để tạo ra bài kiểm tra MBTI ngày một được chuẩn hóa hơn.
Trong mỗi con người luôn có ẩn chứa những sức mạnh mà bản thân họ đôi khi chưa nhận biết được. Thông qua trắc nghiệm MBTI, bạn sẽ nắm bắt được rõ đâu là thế mạnh mình sở hữu và cần khai thác nhiều hơn. Từ đó, bạn biết cách đầu tư để phát triển sức mạnh của bản thân một cách tốt nhất. Cụ thể, dựa trên kết quả, bạn có thể thiết lập được hệ giá trị gồm những điểm mạnh – điểm yếu của bản thân.
2. 4 tiêu chí nền tảng trong trắc nghiệm MBTI
2.1. Tri nhận thế giới thông qua Sensing (Giác quan) / Intuition (Trực giác)
Cặp xu hướng Sensing (Giác quan) / Intuition (Trực giác) chính là xu hướng đối lập nhau về cách mà con người tiếp nhận các sự việc, hiện tượng xung quanh họ.
Mọi thứ được tìm hiểu qua các giác quan cụ thể: màu sắc, hình ảnh (thị giác); mùi vị (vị giác), âm nhạc (thính giác),… Tất nhiên, quá trình phát triển tri nhận luôn có sự cộng hưởng để quá trình ấy diễn ra thật sống động. Mọi thứ đều được ghi nhận, tổng hợp và phân tích.
Ở một giai đoạn cao cấp hơn, các trực giác tạo ra các xung nhịp về sự tri nhận đến bộ não. Đây là lúc các xung nhịp ấy được chuyển hóa, được tri nhận thông qua sự diễn dịch, lí giải, liên kết các hình ảnh. Từ đó, các suy đoán, phán đoán tương lai được hình thành.
2.2. Quyết định lựa chọn giữa 2 bàn cân: Cảm xúc (Feeling) hay Lý trí (Thinking)
Phần lý trí trong bộ não con người được đánh giá cao nhất. Nó đóng vai trò tìm hiểu các tiêu chí đúng – sai, trái – phải,… Từ tìm hiểu ban đầu, sau đó suy luận một cách logic mới trực tiếp cho đáp án cụ thể, đảm bảo tính khoa học nhất có thể.
Sự đối lập luôn tồn tại và phần cảm xúc là một biểu hiện như thế. Phần cảm xúc xem xét sự việc trên tổng thể những cảm xúc: yêu, ghét, giận, hờn,… Đồng thời, các yếu tố đó có sự tác động qua lại lẫn nhau. Đó là bản chất của vấn đề cảm xúc do não quyết định.
2.3. Xu hướng con người Extraversion (Hướng ngoại)/ Introversion (Hướng nội)
Nếu Hướng ngoại (Extraversion) thể hiện xu hướng ứng xử của một cá nhận với thế giới bên ngoài thì Introversion Hướng nội (Introversion) lại phản ánh cách họ ứng xử với chính bản thân họ.
Hướng nội là hướng vào nội tâm, gồm cả ý nghĩ, tư tưởng, trí tưởng tượng.
Hướng ngoại là hướng về thế giới bên ngoài gồm những hoạt động, con người, đồ vật.
Nếu bạn là người đại diện cho tiêu chí này, bạn sẽ làm việc dựa trên các nguyên tắc. Việc tổ chức theo hệ thống, có kế hoạch với những sự chuẩn bị rõ ràng là điều bạn hướng đến.
4 tiêu chí vừa nêu trên chính là cơ sở để vạch ra 16 tính cách MBTI, bạn có thể tìm hiểu sâu hơn trong đề mục tiếp theo.
3. Khám phá 16 tính cách MBTI
3.1. Nhóm Analysts
Bao gồm 4 nhóm tính cách: INTP, ENTP, ESTJ, ENTJ.
3.2. Nhóm Diplomats
Bao gồm 4 nhóm tính cách: INTJ, INFP, ISFJ, INFJ.
3.3. Nhóm Sentinels
Bao gồm 4 nhóm tính cách: ENFJ, ENFP, ISTJ, ESFJ.
3.4. Nhóm Explorers
Bao gồm 4 nhóm tính cách: ISTP, ISFP, ESTP, ESFP.
4. Lời kết
Trắc nghiệm cá tính đơn thuần là một phương pháp giúp bạn giới hạn phạm vi nhận diện tiềm năng. Bạn có tận dụng và phát triển được chúng hay không là do chính bạn. TopDev hy vọng các bạn sẽ biết được đâu là thiên hướng của bản thân mình. Xác định được những điểm mạnh sẽ giúp các bạn lập kế hoạch hoàn thiện năng lực một cách tốt nhất. Chúc các bạn thành công!
Tuyển Dụng Nhân Tài IT Cùng TopDev Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products
Bài viết được sự cho phép của tác giả Vũ Công Tấn Tài
Bạn phấn đấu rất nhiều và phải vượt qua những kì thi căng thẳng để được đặt một chân đến giảng đường đại học, nơi bạn tin rằng (hoặc chí ít là được nói rằng) đây sẽ là nơi đảm bảo cho bạn một tương lai tương lai tươi sáng. Bạn dành khoảng thời gian tương đối dài (khoảng 3 – 4 năm) để học hỏi những kiến thức chuyên môn hoặc các kĩ năng bổ trợ (toán, ngoại ngữ, …). Có bao giờ bạn thắc mắc rằng: liệu có phải cứ vượt qua hết các kì thi ở trường và có trong tay tấm bằng đại học là sẽ đảm bảo được một việc làm tốt, một công việc có thu nhập cao?
Là một người đã từng trải qua thời đại học, mình hiểu được rằng các bạn sinh viên hiện nay đang rất thiếu những thông tin và kĩ năng cần thiết để bước vào công cuộc tìm kiếm công việc phù hợp và xây dựng sự nghiệp sau đó. Nhà trường thì chỉ liệt kê danh sách các môn học ở từng học kì, thầy cô dạy cũng ít khi nói gì thêm về môi trường doanh nghiệp bên ngoài, các thông tin trên internet thì quá ít thông tin hữu ích và xác thực. Đó là một vài lí do khiến mình muốn chia sẻ với các mọi người về việc làm thế nào để có được một công việc tốt khi ra trường. Điều này cũng có thể có ích đối với những bạn đang làm việc và muốn có một công việc khác tốt hơn.
Hướng đi, hay còn có thể nói là mong muốn của bản thân trong lĩnh vực IT, bởi thị trường hiện nay đang có rất nhiều con đường cho bạn lựa chọn. Nếu chọn đi làm ở các công ty, bạn có thể theo hướng phát triển ứng dụng Web, ứng dụng mobile (iOS, Android), bảo mật, quản trị hệ thống mạng, cơ sở dữ liệu … Một số ngành mới cũng khá hot như: phân tích data, xử lí AI về nhận dạng, … Nếu bạn chưa muốn đi làm vội mà muốn theo hướng nghiên cứu, có thể chọn lựa việc học tiếp lên Cao học, rồi xin thực tập và làm việc trong các viện nghiên cứu, trường đại học, hoặc đi du học (học bổng ở hướng nghiên cứu này khá nhiều) .v.v…
Tùy vào từng hướng đi cụ thể mà sau đó chúng ta mới xác định được cụ thể những việc cần làm, tuy vậy có những điểm chung mà tất cả chúng ta đều phải nắm dù có đi theo con đường nào đi nữa. Về việc học lên cao hơn nữa ở các bậc học sau đại học, theo suy nghĩ chủ quan của mình (và có tham khảo một vài anh chị có kinh nghiệm), trừ khi bạn muốn đi theo con đường nghiên cứu hoặc cách ngành nghề nặng tính học thuật như xử lí dữ liệu lớn bigData, nhận dạng, AI, … thì việc học lên cao hơn không phải là lựa chọn tối ưu ở môi trường làm việc tại Việt Nam. Tập trung và thực hành những công nghệ mới và học hỏi kinh nghiệm từ những người đi trước đôi khi sẽ phù hợp hơn với một lập trình viên phần mềm.
Nắm vững những kiến thức cứng
Đây là thứ mà bạn được dạy nhiều nhất ở trường. Dù bạn có theo hướng nào: Web, Mobile hay AI, … bạn cũng cần nắm những kiến thức căn bản trong lập trình như: kĩ thuật lập trình, lập trình hướng đối tượng, cấu trúc dữ liệu và giải thuật, cơ sở dữ liệu căn bản. Đây là những môn học và kiến thức nền tảng, những kiến thức này thuộc dạng “trường tồn với tháng năm” và không dễ bị thay đổi trong 1 sớm 1 chiều được.
Nếu bạn là sinh viên mới tốt nghiệp, học tốt các môn này ở trường là một lợi thế để nhà tuyển dụng chú ý bạn. Nếu bạn đã đi làm rồi, chắc hẳn những kiến thức này sẽ giúp ích cho bạn rất nhiều trong quá trình tìm hiểu và áp dụng những công nghệ mới để giải quyết những vấn đề thực tế trong đời sống. Ở mức Fresher hoặc Junior, việc ít kinh nghiệm và hiểu biết về công nghệ có thể được châm chước, nhưng thiếu các kiến thức nền tảng sẽ rất khó để bạn có thể vượt qua vòng phỏng vấn cho một vị trí tốt.
Chú ý quá trình làm việc nhóm ở trường
Phát triển phần mềm là một công việc của tập thể, vậy nên các công ty cũng rất chú trọng tới kĩ năng làm việc nhóm của bạn. Làm việc nhóm ở đây không phải là cái gì đó quá lớn lao, đơn giản chỉ là cách mà bạn thực hiện đồ án môn học cùng với nhóm như thế nào, tổ chức nhóm và phân công nhiệm vụ cho từng thành viên như thế nào, làm thế nào để mọi người cùng làm chứ không bị hiện tượng “gánh team”, nếu có vấn đề phát sinh (thầy cô thay đổi đề, có bạn nghỉ, …) thì nhóm sẽ giải quyết thế nào, là một thành viên trong nhóm bạn có tích cực trao đổi và bàn bạc không hay chỉ thụ động chờ người khác phân công, …
Những câu hỏi ở trên thật ra sẽ rất dễ để trả lời nếu bạn có làm việc nhóm 1 cách nghiêm túc khi còn đi học. Đôi khi những bài học rút ra từ thất bại còn được đánh giá cao hơn khi bạn đã hoàn thành môn học đó một mình. Đọc đến đây chắc mọi người cũng sẽ biết được một sự thật là các “thánh gánh team” sẽ không hề được đánh giá cao. Vậy nên chưa chắc gì bạn giỏi kĩ năng cứng mà đã được công ty tuyển dụng chú ý đâu nha. Thái độ và khả năng hợp tác của bạn là một yếu tố sẽ được cân nhắc rất nhiều.
Học các môn học có chương trình đào tạo tiên tiến và hợp thời
Với sự thay đổi nhanh chóng của công nghệ hiện nay, dẫu cho chương trình đại học vẫn bị đánh giá là hơi “lạc hậu” nhưng không phải là không có những môn học hợp thời. Ngoài việc tập trung cho các kĩ năng và môn học nền tảng kể ở trên, thì bạn cũng nên đăng kí học những môn học “hiện đại” hơn như: lập trình thiết bị di động, phát triển ứng dụng web (java, PHP, nodejs, …), các hệ thống xử lí phân tán, thiết kế giao diện phần mềm, NoSQL … Đây là những môn học gần như bắt buộc đối hoặc là rất cần thiết với các bạn muốn đi theo hướng Web hoặc mobile sau này.
Bạn có thể học những môn học này ở trường, hoặc nếu không được dạy ở trường, bạn có thể học thêm ở trung tâm hoặc các khóa học online. Các khóa học online về những công nghệ hiện đại này có rất nhiều trên internet. Hãy tận dụng thời gian rảnh rỗi của bản thân để học hỏi thêm, nếu nắm vững những kiến thức nền tảng và cả những kiến thức về các công nghệ hiện đại nữa, thì bạn sẽ có điểm cộng rất lớn trong mắt các công ty đó.
Thực tập ở cty muốn làm việc.
Đừng nghĩ rằng khi còn đang đi học là bạn không có cơ hội có được kinh nghiệm thực tế. Ngược lại, bạn có thể xin đi thực tập ở các công ty về lĩnh vực bạn muốn theo đuổi sau này để có được kinh nghiệm làm việc cũng như cái nhìn thực tế hơn. Hiện nay hầu hết các trường đều tổ chức cho sinh viên thực tập ở cuối năm 3 hoặc năm 4, vậy nên hãy tận dụng các cơ hội này để có được kinh nghiệm thực tế.
Nếu như trường bạn không tổ chức thực tập thì sao? Không sao cả, bạn hoàn toàn có thể nộp hồ sơ đến thẳng công ty để xin thực tập cũng được. Các công ty cũng sẽ rất sẵn lòng hỗ trợ những sinh viên năng động trong công việc. Trên internet hiện nay có trang intership.edu.vn cũng rất hay đăng các thông tin về thực tập, các bạn sinh viên có thể tìm kiếm cơ hội của mình ở đây. Ngoài ra bạn có thể tham khảo các công ty hàng đầu tại Việt Nam dưới đây:
Cách tốt nhất để chuẩn bị cho công việc ở một công ty nào đó là hãy làm việc cho họ ở vị trí thực tập sinh, như thế bạn có thể hiểu được nhiều hơn về công việc và cả công ty đó. Bạn có thể thực tập một vài tháng hè, sau đó trở lại trường học nốt chương trình còn lại, rồi liên hệ lại công ty sau khi đã ra trường, các công ty cũng hay có những ưu tiên dành cho các bạn từng thực tập lắm đó.
Thị trường việc làm ngày nay đang rất thiếu những người có kĩ năng và thái độ làm việc tốt, mình nhấn mạnh lại là “những người có kĩ năng và thái độ tốt” nhé vì thực trạng cũng đang có rất nhiều người đang thất nghiệp. Giữa muôn vàn người đi tìm công việc, việc học vững các kiến thức ở trường cùng các kĩ năng làm việc nhóm và kinh nghiệm có được khi đi thực tập sẽ làm những điểm nổi bật giúp bạn tạo được chú ý với các nhà tuyển dụng hơn.
Để làm được những điều trên, bạn cần chủ động hơn trong các nhiệm vụ của mình. Hi vọng các bạn sẽ có cái nhìn cụ thể hơn chút xíu về con đường tương lai sau này nhé.
Mấy ngày nay toàn viết bài về tối ưu hệ thống. Hôm nay mình cũng viết bài về tối ưu hệ thống nhưng sẽ hướng đến designer. 1 trong những đối tượng mà mình cũng rất thích.
Như chúng ta đã biết, hiện nay tỉ lệ image đang chiếm đến 50% trên toàn bộ các trang web trên thế giới.
Việc hiệu năng trang web giảm cũng kéo theo rất nhiều thứ theo nó. Ví dụ như trải nghiệm người dùng thấp, doanh thu giảm. Đây là 1 ví dụ của Pinterest sau khi tối ưu thành công hiệu năng web mobile.
Qua đó chúng ta thấy được, 1 khi trải nghiệm người dùng tốt thì mọi thứ cũng đều trở nên tốt đẹp hơn. Trong đó có cả doanh thu đấy.
Kết quả sau khi dùng Progressive Web App
Do đó, không chỉ developer mà ngay cả chính designer cũng cần phải có trách nhiệm trong vấn đề sử dụng image website cho hiệu quả.
Hiện nay website trên toàn thế giới đang có xu hướng càng ngày càng nặng hơn. Theo như thống kê của httparchive.org cho chúng ta thấy, cách đây 7 năm (2012/02/15) kích thước trung bình của website là 986 KB. **Thời điểm thống kê (2018/02/15) thì nó đã đạt đến **3686 KB.
Chỉ trong vòng gần 6 năm mà website đã nặng lên gần **373.8%. **Điều đó chứng tỏ website trên toàn thế giới đang có xu hướng xấu đi.
So với những năm trước đó thì video cũng chiếm 1 phần không nhỏ trong website, thế nhưng thằng đang chiếm nhiều nhất lại là image.
Tại sao hiệu năng website lại quan trọng?
Theo như thống kê Google/SOASTA năm 2017 cho thấy:
cứ khi tốc độ tải trang tăng từ 1s -> 3s thì tỉ lệ người dùng rời khỏi trang web tăng 32%
cứ khi tốc độ tải trang tăng từ 1s -> 5s thì tỉ lệ người dùng rời khỏi trang web tăng 90%
cứ khi tốc độ tải trang tăng từ 1s -> 6s thì tỉ lệ người dùng rời khỏi trang web tăng 106%
cứ khi tốc độ tải trang tăng từ 1s -> 10s thì tỉ lệ người dùng rời khỏi trang web tăng 123%
Từ đó ta thấy được hiệu năng của trang web có mức độ ảnh hưởng to lớn như thế nào. Nó không chỉ ảnh hưởng đến trải nghiệm người dùng mà còn ảnh hưởng đến doanh thu của công ty (người dùng rời khỏi trang web tăng -> doanh thu đương nhiên sẽ giảm).
Lí do tại sao website lại càng nặng?
Nguyên nhân chủ yếu khiến website nặng là do hình ảnh trên trang web chưa được tối ưu. Vậy nguyên nhân nào khiến nó chưa được tối ưu?
Đầu tiên, khi design và phát triển 1 website thì rất khó có thể biết được trách nhiệm của desinger kết thúc ở đâu? và trách nhiệm developer kết thúc ở đâu?
Ví dụ như việc nén hình ảnh để tối ưu tốc độ thì ai sẽ là người làm? Designer hay là Developer sẽ làm?
Thông thường thì designer sẽ chọn ảnh và sau đó nhờ developer upload lên server? Hay là khi upload ảnh lên server thì hệ thống sẽ tự đống nén ảnh?
Thứ 2, hầu hết các desinger đều không biết hiệu năng của website đang tồi tệ đến mức độ như thế nào? Bao nhiêu image đang có kích thước quá to và nó đang ảnh hưởng đến trải nghiệm của người dùng như thế nào?
Thứ 3, những tool, những kĩ thuật về việc nén ảnh như pro thì designer hầu như không biết. Có lẽ đây là 1 trong những lí do chính.
Làm thế nào có thể tối ưu image website như pro?
Để làm được điều này thì trước khi quyết định sử dụng image trong website, thì các bạn hãy trả lời những câu hỏi dưới đây nhé.
Có cần xử lý toàn bộ hình ảnh không?
Hình ảnh là 1 trong những bộ phận khá quan trọng trong website. 1 website mà toàn chữ chắc chẳng ai muốn đọc cả.
Thế nhưng 1 website mà có quá nhiều ảnh thì lại làm hiệu năng của website bị giảm xuống. Do đó mà trước khi thêm 1 ảnh nào đó vào trong website thì hãy thử nghĩ xem thật sự hình ảnh đó có cần hay không?
Nếu cho vào thì nó có làm content hay hơn không? Hay chỉ làm cho website trông đẹp hơn?
Ảnh có phải loại vector hay không?
Hình ảnh mà bạn đang xử dụng có phải loại vector hay không? Nếu hình ảnh bạn đang dùng là loại vector thì đừng nên export nó ra dạng PNG hay JPG. Hãy nên export nó ra dạng SVG cho nhẹ nhé.
Hiện tại hầu như browser nào cũng support SVG. Nên các bạn cũng không cần phải lo lắng cho điều này.
Hình ảnh có nền trong suốt không?
Hình ảnh mà được lưu dưới dạng PNG sẽ luôn nặng hơn hình ảnh được lưu dưới dạng JPG. Nếu hình ảnh của bạn không cần nền trong suốt thì khi đó hãy export ra dạng JPG nhé.
Hình ảnh đã được nén tối đa chưa?
Đa số designer đều nói trong Photoshop hay Pixelmator có cái option là “Save for Web”. Nếu export ảnh mà chọn option này thì cũng nén ảnh OK rồi.
Thế nhưng so với các tool TinyPNG hay JPEGmini thì option “Save for Web” không phải là lựa chọn hợp lí.
SVGOMG
Đây là 1 trong những ứng dụng web, có thể dùng trực tiếp ở đây. Ứng dụng này có thể giúp ta xoá 1 vài thông tin không cần thiết từ file SVG.
Ở trong những editor về graphics như photoshop thì luôn luôn có 1 vài thông tin về metadata, comment, 1 số hidden element. Những thông tin này có thể là nguyên nhân gây file SVG bị phình to.
Nếu xoá những thông tin này đi sẽ giúp giảm kích thước SVG khá tốt. Đặc biệt là không làm mất đi chất lượng hình ảnh.
TinyPNG
Đây cũng là 1 trong những ứng dụng web, có thể sử dụng trực tiếp tại đây.
Nếu như bạn có hình ảnh nào cần làm trong suốt background thì tool này là 1 tool khá hữu ích.
JPEGmini
Đây là 1 trong những tool nén ảnh JPG tốt nhất từ trước đến nay mà mình đã dùng. Nó có thể nén hình ảnh đến 50% mà mắt thường nhìn vào cũng không thể phân biệt được đâu là ảnh gốc và đâu là ảnh đã nén.
Bạn có thể tải ứng dụng này tại đây. Tuy nhiên ứng dụng này là bản mất phí, dùng được cho cả Window lẫn Mac.
Hình ảnh có cần phải responsive hay không?
Nếu bạn nghĩ, trang web của bạn không cần thiết phải hiển thị hình ảnh responsive đến cho người dùng thì cái này là hoàn toàn sai nhé.
Hiện tại tỉ lệ user dùng mobile càng ngày càng tăng lên. Nếu họ dùng wifi để kết nối đến thì không vấn đề gì. Nhưng đa số thời gian họ ở bên ngoài và dùng 3G, 4G để lướt web.
Khi đó tốc độ mạng cũng như băng thông sẽ bị hạn chế. Nếu phải load hình ảnh nặng thì UX sẽ không tốt. Do vậy việc cung cấp 1 hình ảnh nhẹ hơn trên mobile là 1 điều cần thiết.
Hiện tại đa số các hệ thống CMS như wordpress đều support responsive cho image.
Để hiểu sâu hơn về tính responsive trong image, các bạn có thể tham khảo bài viết này.
Kết luận
Nếu xử lý hình ảnh trong website 1 cách cẩu thả sẽ là nguyên nhân chính gây phá hoại trải nghiệm người dùng, và có thể làm cho công ty của bạn mất tiền do nó ảnh hưởng tiêu cực đến hiệu suất.
Thật may mắn có rất nhiều công cụ, kĩ thuật giúp desinger làm được điều này.
Nếu các bạn có lời khuyên nào cho việc xử lý hình ảnh trên webiste thì hãy để lại lời nhắn ở phần comment bên dưới nhé.
Công nghệ trong Ngành bảo hiểm nói chunghay InsurTech nói riêng đang có tiềm năng vô cùng lớn tại thị trường Việt Nam. Trò chuyện cùng TopDev TV, anh Nguyễn Quang Trung (Bill), hiện đang là Phó Tổng Giám Đốc Công Nghệ Thông Tin AIA Việt Nam, sẽ chia sẻ một số góc nhìn về công nghệ và tiềm năng của thị trường này.
Anh Nguyễn Quang Trung (Bill), sinh ra ở Việt Nam nhưng đã làm quen với cuộc sống tại đất nước Pháp từ năm 10 tuổi.
Đến năm 2009, anh quay về Việt Nam và làm việc cho đến hiện tại, từng kinh qua các tập đoàn lớn như IBM, GNT và 4 năm gần đây là làm việc tại AIA Việt Nam.
Anh nghĩ career path của mình của hơi đặc biệt. Anh bắt đầu làm việc từ năm 19 tuổi, khi chỉ vừa bắt đầu vào đại học. Những ngày đầu, anh nhận thấy môi trường và cách học Công nghệ thông tin ở Pháp không phù hợp và cho mình thế nên anh quyết định vừa đi làm, vừa đi học. Anh đi học 2 tuần và đi làm 2 tuần. Cứ như vậy trong suốt 2 năm và đạt được bằng đại học đầu tiên. Sau đó, anh đi làm chính thức. Bởi tại thời điểm ấy, ngành IT chưa phổ biến nên ban ngày thì anh làm việc, còn ban đêm thì anh lại đi học thêm để đạt được tấm bằng Master Degree.
Sau quãng thời gian đó, anh làm cho một tập đoàn khá lớn về Consulting Service, đó là Altran Europe. Anh làm cho tập đoàn này khoảng 6 năm. Tại đó, anh đã được làm nhiều project như ngành automobile (ngành ô tô) cho Mercedes; ngành pharmaceutical (ngành dược) cho Sanofi Aventis ; và rất nhiều tập đoàn lớn & lĩnh vực khác nhau tại Pháp.
Tại sao anh lại đặt Head Title trong Profile của mình là CxO thay vì chức vụ hiện tại là CTO hay CIO? Có phải CxO này là Chief Experience Officer?
Về điểm này anh nghĩ, thực ra chữ CXO chỉ mới phổ biến trong vài năm vừa qua thôi. Còn về title của anh, chữ CxO là chữ x nhỏ chứ không phải X to. Trên thực tế, chữ CxO này của anh ý nghĩa là bởi anh không không nghĩ anh là một người chỉ biết, làm mỗi về Technology. Bởi trong thế giới hiện tại, đòi hỏi rất nhiều người có khả năng làm việc linh hoạt (Agile) để có thể quản lý được hết công việc trong một project (dự án) hay trong một business (doanh nghiệp).
Vì thế, chữ CxO ở đây mang ý nghĩa thể hiện sự linh hoạt; trong một quá trình, anh có thể làm cả về công nghệ, kinh doanh, tài chính, chiến lược, marketing,… Tóm lại, CxO nghĩa là anh có thể làm việc linh hoạt trong nhiều công việc khác nhau. Nhưng điều ấy không có nghĩa mình là chuyên gia trong toàn bộ các lĩnh vực ấy. Chuyên môn của mình vẫn là về công nghệ, tuy nhiên mình vẫn có thể phát triển được những xu hướng khác .
Ứng dụng công nghệ vào các sản phẩm bảo hiểm như thế nào?
Khi một gói sản phẩm bảo hiểm nhân thọ (life insurance) được đưa ra thường sẽ tập trung vào 3 điểm:
Đầu tiên phải biết khách hàng họ là ai?
Thứ 2 là khả năng tài chính của khách hàng như thế nào ? (Financial Situation Status)
Thứ 3 là tình trạng sức khỏe của họ khi mua bảo hiểm (Medical Health Status)
Từ đó, công nghệ có thể được ứng dụng vào 3 yếu tố này.
Anh có thể chia sẻ thêm về các công nghệ trong ngành bảo hiểm được áp dụng cho 3 yếu tố trên được không?
Để áp dụng công nghệ trong bảo hiểm thì mình áp dụng ở đây là OCR (nhận dạng ký tự quang học), voice recognition, facial recognition và tiếp theo là cả Machine Learning và AI. Đặc biệt trong AI thì mình sẽ áp dụng nó cho AI Underwriting (thẩm định bảo hiểm).
Ứng dụng trong Underwritingđó là mình làm sao automation (tự động hóa) và validate (xác nhận) tất cả thông tin của khách hàng. Từ chứng minh nhân dân mình có thể nhận diện ra được mà không cần tự input vì nó không có nhiều vấn đề phát sinh.
Thứ 2 là mình có facial recognition để mình biết được người đó còn sống (alive) hay không. Điểm thứ 3 là công nghệ AI áp dụng facial recognition để mình biết một hình chụp trên chứng minh nhân dân cách đây 10 năm so sánh với một người hiện tại thì match bao nhiêu % với nhau. Đó là những gì AI đang áp dụng choAI Underwriting.
Tiếp theo đó là Claims Automation Processing (Tự động hóa Quá trình yêu cầu bồi thường bảo hiểm).Cũng là việc xem process trên những công nghệ cũ nhưng nay mình có thể làm tự động qua API và AI để rút ngắn thời gian trong Insurance Claim Process (quy trình yêu cầu bảo hiểm xử lý)
Tập đoàn bảo hiểm AIA Việt Nam có sử dụng công nghệ chatbot không?
Thành thật mà nói, Chatbot là một công nghệ rất hot hiện tại và anh nghĩ tất cả mọi người đều muốn sở hữu chatbot. Tuy nhiên, chatbot mà thực sự hiệu quả thì anh nghĩ là chưa có. Tại AIA Việt Nam cũng đã thử nghiệm và đã có một chatbot. Tuy nhiên, một chatbot để đưa cho end-user, một khách hàng thực sự sử dụng thì hiện tại vẫn chưa thành công.
Tại sao chưa thành công? Vì điểm thứ nhất, xu hướng và tư duy sử dụng của khách hàng Việt vẫn chưa quen sử dụng qua Chatbot. Điểm thứ 2 đó là công nghệ AI phía sau Chatbot phải thông minh. Để xây dựng một Chatbot đáp ứng nhu cầu ngoài FAQ thì hiện tại điều này đang rất phức tạp và chưa thành công được.
Hiện tại, AIA Việt Nam đang ứng dụng công nghệ Chatbot cho phần internal (nội bộ) của mình để hỗ trợ quá trình bán hàng hay bộ phận HR (được process hóa, FAQ – Frequently Asked Questions, câu trả lời thông minh dựa trên process đã có) và trong tương lai mình cũng sẽ triển khai điều đó cho internal workforce (nội bộ) hoặc salesforce (đội ngũ bán hàng) của mình.
Theo anh vì sao Insurtech vẫn chưa phát triển tại Việt Nam?
Đầu tiên nên làm rõ, trong lĩnh vực bảo hiểm có 2 loại là Bảo hiểm nhân thọ (life insurance) và phi nhân thọ (non-life insurance). Insurtech trên thực tế đang được áp dụng rất nhiều và ứng dụng cho ngành non-life insurance (bảo hiểm phi nhân thọ). Một trong số những startup Insurtech mà anh thấy sản phẩm của họ làm rất tốt, đó là Lemonade, dù là Startup nhưng cách họ tiến hành Customer Experience (CX) đã khiến sản phẩm của họ có chỗ đứng trong ngành InsurTech. Đương nhiên, những business hay những sản phẩm như của Lemonade có thể áp dụng được ở Việt Nam hay không là tùy thuộc vào mindset (tư duy) và Customer Experience (trải nghiệm khách hàng) nữa. Ở Việt Nam, Fintech thành công trong lĩnh vực payment (e-wallet) thì đã có những cái tên như MoMo, Zalopay,… Tuy nhiên về Insurtech ở Việt Nam thì vẫn còn tương đối chậm, bởi phần nhiều liên quan đến vấn đề thâm nhập thị trường.
Trau dồi kiến thức IT để theo đuổi mảng bảo hiểm như thế nào?
Anh nghĩ là không chỉ liên quan đến bảo hiểm mà đây còn là những xu hướng, nhu cầu sắp tới trong lĩnh vực IT.
Đầu tiên là về Technology risk, đó là một điểm quan trọng mà mình có nhiều biến đổi.
Tất cả những công nghệ này trên thực tế sẽ là những công nghệ được áp dụng cho tất cả nền tảng đang có digital transformation journey và đặc biệt là cho những tập đoàn lớn.
Bài viết dựa trên chuỗi TopDev TV – Ep22 do TopDev thực hiện
Bạn đang gặp khó khăn vì chưa biết rõ mình cần phải làm gì khi viết Cover Letter (Thư xin việc)? Đừng lo lắng, TopDev sẽ giúp bạn tìm hiểu rõ hơn Cover Letter là gì và cách để tạo ra một thư xin việc chuyên nghiệp.
Cover Letter là gì?
Cover Letter với nhiều tên gọi khác như: application letter hay thư xin việc, là một dạng tài liệu dài một trang được gửi đến nhà tuyển dụng với những mô tả về thế mạnh cũng như các kinh nghiệm bản thân liên quan đến vị trí ứng tuyển.
Chất lượng của một Cover Letter là yếu tố quyết định việc nhà tuyển dụng có nên xem CV (Hồ sơ xin việc) của ứng viên hay không? Vì vậy, thư xin việc có một vai trò rất quan trọng. Việc sàng lọc ban đầu là cần thiết, bạn hãy thể hiện mình là một ứng viên tiềm năng thông qua một Cover Letter chuyên nghiệp nhé!.
Để tạo được một thư xin việc chuyên nghiệp, trước tiên bạn cần biết được cấu trúc cơ bản của một Cover Letter.
Sau đây là những phần nội dung cần có để tạo lập nên một thư xin việc:
1. Phần giới thiệu: Cần được viết chỉn chu, cẩn thận ngay từ ban đầu. Điều này tạo sự để thu hút, chú ý của người quản lý tuyển dụng. Mục tiêu của phần giới thiệu là bạn cần lý giải tại sao bạn mong muốn có được công việc, vị trí này.
2. Phần trọng tâm: Đây là phần chủ chốt để bạn thể hiện bản thân một cách tối đa. Hãy thông minh và có tư duy chiến lược trong việc trình bày những nội dung. Một phần trọng tâm đạt hiệu quả cao nhất sẽ bao gồm ít nhất 2 đoạn văn bản mô tả chi tiết về trình độ học vấn, kỹ năng, kinh nghiệm làm việc,… Nhà tuyển dụng sẽ xem xét kỹ phần này để đánh giá mức độ phù hợp của bạn.
3. Phần kết luận: Hãy kết thúc lại lá thư xin việc với những dòng mô tả ngắn gọn. Lưu ý là bạn đừng quên gợi nhắc người quản lý tuyển dụng liên hệ với bạn (được gọi là lời kêu gọi hành động).
Một Cover Letter chuyên nghiệp sẽ như thế nào?
Bước đầu tiên là bạn cần đảm bảo một Cover Letter đúng chuẩn về bản chất truyền đạt của nó. Tức là Cover Letter phải tóm tắt được nhanh chóng tại sao nhà tuyển dụng họ nên chọn bạn. Thông qua Cover Letter và sự kết nối với CV, nhà tuyển dụng cần thấy ở bạn sự định hình về phong cách cá nhân, năng lực chuyên môn và sự phù hợp với vị trí mà họ đang tìm kiếm. Tất nhiên, nhiệm vụ của bạn là làm thế nào thuyết phục nhà tuyển dụng để họ nắm bắt dễ dàng hơn những gì bạn có.
Nếu xem xét hai mẫu văn bản trên, chắc chắn nhà tuyển dụng sẽ lựa chọn Mẫu 2. Tại sao lại như vậy. Vì đơn giản, nội dung được khai thác và dẫn dắt trực tiếp về vấn đề. Đó là một biểu hiện của tính chuyên nghiệp trong Cover Letter.
Tính chuyên nghiệp còn được thể hiện ở khía cạnh trọng tâm.Tức là bạn cần đi thẳng vào vấn đề. Thể hiện cho họ thấy tại sao họ nên chọn bạn. Loại bỏ những thông tin không cần thiết, hãy tỉ mỉ và thông minh trong cách chọn lọc nội dung muốn truyền tải.
Bên cạnh đó, những kỹ năng hay kiến thức chuyên ngành đáp ứng các vị trí tuyển dụng nên được đưa vào Cover Letter một cách thích hợp. Hãy nhớ mọi thứ không quá nhiều, đơn giản nhưng không hời hợt.
Cách viết Cover Letter hoàn hảo
Nhiều thắc mắc đã được đặt ra như: Tôi nên viết những gì trong thư xin việc của mình? Tôi phải thể hiện điều đó như thế nào? Tôi nên viết nó một cách quá chi tiết chăng? Đừng quá lo lắng vì TopDev sẽ giúp bạn giải đáp những câu hỏi đó.
Bước 1: Đặt chi tiết liên hệ của bạn (và của nhà tuyển dụng) vào mở đầu
Chi tiết liên lạc
Để mở đầu thư xin việc, những nội dung bạn cần quan tâm là:
Tên và họ của bạn
Địa chỉ email của bạn (đảm bảo rằng nó chuyên nghiệp và không phải huycute0599@gmail.com)
Số điện thoại của bạn
Địa chỉ thư tín (Email) của bạn (Tùy chọn)
Liên kết hồ sơ Linkedin của bạn (Tùy chọn)
Dưới thông tin chi tiết liên hệ của bạn, bạn cần bổ sung:
Thời gian
Họ và tên của người cơ quan doanh nghiệp/tổ chức tuyển dụng
Địa chỉ công ty
Số điện thoại của công ty
Tên người quản lý tuyển dụng hoặc địa chỉ email của công ty
Bước 2: Xây dựng phong cách xưng hô chuyên nghiệp
Lời chào mở đầu
Hãy tạo ấn tượng ban đầu tuyệt vời bằng cách gửi Cover Letter của bạn cho một cá nhân bằng tên thật của họ.
Ghi nhớ, bạn nên loại bỏ những kiểu “chào làm thân” đại trà và phản ánh sự lười biếng của bản thân. Một lời chào mở đầu thiếu sự chân thành sẽ làm giảm đi cơ hội trúng tuyển của bạn.
Trong trường hợp bạn chưa chắc chắn về chức danh hay tên gọi thật của họ, đừng ngại xác thực. Cách hiệu quả nhất là thử kiểm tra trang web của công ty. Check trên nền tảng Linkedin, thậm chí là gọi điện hoặc gửi email cho bộ phận nhân sự để hỏi. Nếu vẫn nhận thấy chưa rõ ràng, hãy làm theo những mẹo sau:
Nếu bạn không chắc chắn về chức danh của nhà tuyển dụng (như Ông, Bà, Bà, Tiến sĩ, v.v.), bạn có thể loại bỏ nó khỏi phần chào của mình. Ví dụ: “Jane Smith thân mến” là một cách có thể chấp nhận được.
Nếu bạn không thể tìm ra người tuyển dụng là ai, bạn có thể đoán. Ví dụ: nếu bạn đang ứng tuyển vào vị trí nhân viên nhân sự, bạn có thể gọi tên Giám đốc nhân sự.
Nếu bạn không thể tìm thấy tên của bất kỳ ai, bạn có thể gửi địa chỉ đó cho bộ phận. Ví dụ: “Kính gửi Phòng Nhân sự” là sự lựa chọn không tồi.
Một số ví dụ điển hình về màn chào đầu chuyên nghiệp
Gửi Jane Smith
Gửi cô Smith
Kính gửi Phòng Truyền thông – Marketing
Kính gửi [Tên công ty] Nhà tuyển dụng
Bước 3: Thu hút người quản lý tuyển dụng bằng một lời giới thiệu mạnh mẽ
Đoạn giới thiệu quan trọng
Nhiều ứng viên cho rằng họ quá khổ sở về việc tìm ra cách bắt đầu thư xin việc của họ. Nhưng trên thực tế, nó không quá phức tạp như họ nghĩ. Bạn cần lưu ý, một thư giới thiệu hiệu quả, thu hút nhà tuyển dụng có thể bao gồm những đặc điểm sau:
– Vị trí công việc:Tên vị trí bạn đang ứng tuyển
– Tên công ty:Tên công ty bạn đang ứng tuyển
– Ý định ứng tuyển: Thể hiện được nhiệt huyết của cá nhân bạn đối với vị trí bạn mong muốn ứng tuyển
Ngoài ra, bạn có thể làm làm cho phần giới thiệu của mình thêm sự thu hút bằng cách thêm một số mô tả về tính cách, đam mê hoặc điểm nhấn về nghề nghiệp. Tính cách luôn là điều quan trọng mà nhà tuyển dụng mong muốn thấy ở bạn. Tuy nhiên, nên chắc chắn rằng mọi thứ có chừng mực. Một số cách bạn có thể sử dụng để xây dựng chiến lược giới thiệu thư xin việc độc đáo là:
Thể hiện tình yêu của bạn đối với công ty
Làm nổi bật thành tích trong quá khứ
Thể hiện niềm đam mê với công việc của bạn
Bước 4: Chứng minh rằng bạn là ứng viên hoàn hảo cho công việc
Đây là bước thuộc phần trọng tâm để bạn nắm bắt cách viết cover letter chuyên nghiệp. Và như chia sẻ ở trên, đã đến lúc bạn trình bày một cách thuyết phục tại sao bạn là người phù hợp với vị trí, công việc đó.
Lưu ý về những chia sẻ
Để chỉ ra cho nhà tuyển dụng thấy bạn là một ứng cử viên tuyệt vời, hãy ghi nhớ ba điểm sau:
1. Mạnh dạn, nhưng đừng khoe khoang: Một lá thư xin việc mạnh mẽ thì điều cần truyền tải chính là sự tự tin. Để chứng minh bạn là ứng viên tốt nhất cho công việc, hãy đưa ra những minh chứng về năng lực và thể hiện nó trong thư xin việc của bạn. Đừng nói những điều thiếu thực tế so với khả năng thật sự của bạn.
2. Trung thực và không thêu dệt: Sự chân thật rất quan trọng. Đừng nói dối hoặc thậm chí kéo dài sự thật về những trải nghiệm cá nhân của bạn. Vì điều này chỉ làm bạn tụt lại mãi phía sau, không bao giờ tiến bộ được.
3. Tránh liệt kê những thông tin không liên quan: Thư xin việc của bạn nên được điều chỉnh cho phù hợp với công việc và công ty bạn đang ứng tuyển. Thư xin việc (và sơ yếu lý lịch) của bạn nên phản hồi tin tuyển dụng. Đồng thời, đề cập trực tiếp đến các kỹ năng và trình độ được nhà tuyển dụng nêu ra.
Quan tâm đến những kết quả thực tế
Các nhà quản lý tuyển dụng sẽ có cách kiểm chứng thư xin việc của bạn để tìm xác thực rằng bạn là ứng viên hoàn hảo hay bạn cố thể hiện mình.
Để tăng độ tin cậy, bạn có thể sử dụng các thành tích gần đây để chứng minh (bằng các con số cụ thể) rằng bạn có các kỹ năng để hoàn thành công việc. Cụ thể như sau:
Thành tích nghề nghiệp: Hãy chỉ ra những số liệu chứng tỏ bạn đạt những thành tích về số lượng doanh thu, lợi nhuận, giá trị về sự hài lòng,…
Khen ngợi về chuyên môn: Bạn đã nhận được những đánh giá như thế nào từ cấp quản lý hoặc đồng nghiệp của mình
Giải thưởng chuyên môn: Bạn đã nhận được giải thưởng gì sau những nỗ lực, cống hiến?
Trau dồi và rèn luyện các phẩm chất
Ý nghĩa về lợi thế luôn được đặt lên bàn cân của nhà tuyển dụng. Bạn đừng quá lo lắng và e dè khi kinh nghiệm bản thân chưa đủ. Đừng lo ngại vì trên thực tế, người quản lý tuyển dụng còn đánh giá thư xin việc trên cơ sở khai thác những phẩm chất khác, chẳng hạn như:
Thành tích học tập (và các thành tích khác): Bạn có bằng cấp (cử nhân, thạc sĩ hoặc tiến sĩ không?). Kết quả GPA của bạn như thế nào? Suốt quá trình học tập và trải nghiệm, bạn có đạt học bổng nào không? Bạn có tham gia thực hiện các luận án khoa học chuyên ngành nào đó hay chưa?
Các hoạt động ngoại khóa: Bạn đã từng trải nghiệm công việc bán thời gian nào chưa? Các hoạt động tình nguyện, dự án xã hội nào mà bạn đã tham gia? Bạn có theo đuổi sở thích và đam mê không?
Động lực bản thân và thiết lập mục tiêu: Các mục tiêu ngắn hạn và dài hạn của bạn là gì? Công việc bạn đang ứng tuyển có ý nghĩa gì đối với mục tiêu bạn đã đề ra?
Hãy nhớ rằng bất kỳ thông tin nào bạn đưa vào phải liên quan đến công việc bạn đang ứng tuyển . Ví dụ, trải nghiệm các cuộc thi về công nghệ sẽ là câu trả lời thuyết phục khi bạn ứng tuyển các vị trí trong ngành IT.
Bước 5: Đánh giá sơ bộ và hoàn thiện nội dung thư xin việc
Khi viết thư xin việc, hãy thể hiện mình là một ứng viên lịch sự và tự tin. Dù là đoạn cuối cùng nhưng bạn vẫn phải đảm bảo sự cẩn thận, tỉ mỉ. Để có thể hoàn chỉnh chiếc Cover Letter một cách hiệu quả, bạn hãy lưu ý những vấn đề sau:
Cảm ơn người quản lý tuyển dụng đã xem xét sơ yếu lý lịch và thư xin việc của bạn
Khái quát lại lý do tại sao bạn là một ứng viên tiềm năng
Nhắc lại niềm đam mê của bạn dành cho vị trí, công việc đó
Lịch sự yêu cầu họ gửi cho bạn lời mời phỏng vấn
Bước 6: Khép lại Cover Letter bằng một màn chào kết thúc chuyên nghiệp
Ký tên vào thư xin việc của bạn với một lời chào kết thúc chuyên nghiệp:
Bạn có thể sử dụng các cách ký tắt thư xin việc chuyên nghiệp sau đây:
Tôi – Em cảm ơn
Trân trọng – Trân trọng cảm ơn
Cảm ơn – Xin cảm ơn
Chân thành cảm ơn – Xin chân thành cảm ơn
Sau cùng, bạn hãy tạo hai khoảng cách giữa lời chào và nhập tên đầy đủ của bạn.
Bước 7: Kiểm tra lại Cover Letter
Đã đến lúc xác nhận mọi thứ đang đúng quỹ đạo của nó. Liệu thư xin việc của bạn có thật sự đúng quy chuẩn và tạo được sự ấn tượng chưa? Hãy tự hỏi mình những câu hỏi sau đây:
Định dạng thư xin việc của mình đã đúng chưa?
Một Cover Letter chuyên nghiệp sẽ có 200-350 từ được sắp xếp trong một khoảng trống trên một trang A4. Kiểu phông chữ phải đồng nhất, mức độ chênh lệch không quá nhiều. Khoảng cách lề tạo cảm giác thuận mắt nhất của thư xin việc là từ 1’’ – 1,5’’.
Rà soát nội dung và các lỗi cần thiết
Văn phong – giọng điệu trong thư xin việc là một yếu tố quan trọng. Lưu ý rằng bạn không nên viết thư xin việc một cách quá trang trọng. Sự nhầm tưởng này không làm cho Cover Letter của bạn chuyên nghiệp hơn. Mặt khác, nó lại khiến cho thư xin việc trở nên cứng nhắc và khó để nắm bắt các thông tin.
Để cải thiện tức thì văn phong – giọng điệu thư xin việc của bạn, hãy thử những cách sau:
Tránh dùng các danh ngữ sáo rỗng, chẳng hạn như “suy nghĩ khách quan” và “sức mạnh tổng hợp”
Chọn các từ ngữ đơn giản, không chứa nhiều sắc thái quá trang trọng
Bạn nhớ đọc lại thư xin việc và rà soát các lỗi về dùng từ, chính tả, cách diễn đạt, ngữ pháp câu.
Nếu phát hiện câu cú quá dài dòng, hãy lượt bớt những thông tin không quan trọng. Nếu nhận ra cách diễn đạt quá lủng củng, hãy sửa lại ngay để thông điệp về thông tin của bạn được nhà tuyển dụng nắm bắt một cách tốt nhất.
Gợi ý các mẫu template Cover letter/mẫu thư xin việc
Nếu bạn có hứng thú muốn biết về nhận dạng khuôn mặt hoặc video stream, đến computer vision hoặc build một đường pipeline hoàn chỉnh cho việc phân loại ảnh; kiểu gì cũng sẽ đụng đến OpenCV ở đâu đó trên đường học và thử. Vậy OpenCV là gì?
Sự thật là việc học về OpenCV đã từng khó khăn hơn giờ gấp 100 lần. Tài liệu thì khó tìm, chả biết đau để định hướng. Tutorial cũng khá khó theo và không hoàn thiện.
Tin tốt là để hiểu được OpenCV không còn quá khó khăn như thế nữa, việc nghiên cứu OpenCV đã trở nên dễ dàng hơn nhiều. Hôm nay hãy cùng TopDev tìm hiểu những định nghĩa, tính năng và phạm trù cơ bản nhất của OpenCV để hiểu hơn bạn cần làm gì tiếp thao và tìm kiếm thông tin ở đâu để nắm chắc OpenCV.
OpenCV là gì ?
Project OpenCV được bắt đầu từ Intel năm 1999 bởi Gary Bradsky. OpenCV viết tắt cho Open Source Computer Vision Library. OpenCV là thư viện nguồn mở hàng đầu cho Computer Vision và Machine Learning, và hiện có thêm tính năng tăng tốc GPU cho các hoạt động theo real-time.
OpenCV được phát hành theo giấy phép BSD (*), do đó nó miễn phí cho cả học tập và sử dụng với mục đích thương mại. Nó có trên các giao diện C++, C, Python và Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế để hỗ trợ hiệu quả về tính toán và chuyên dùng cho các ứng dụng real-time (thời gian thực). Nếu được viết trên C/C++ tối ưu, thư viện này có thể tận dụng được bộ xử lý đa lõi (multi-core processing).
* Giấy phép BSD: dành riêng cho các loại mã nguồn mở nhằm cho phép sử dụng miễn phí và hạn chế tối đa các rào cản luật lệ thông thường. Giấy phép BSD là một giấy phép đơn giản chỉ yêu cầu tất cả các mã được cấp phép theo giấy phép BSD nếu được phân phối lại ở định dạng mã nguồn.
OpenCV có một cộng đồng người dùng khá hùng hậu hoạt động trên khắp thế giới bởi nhu cầu cần đến nó ngày càng tăng theo xu hướng chạy đua về sử dụng computer vision của các công ty công nghệ. OpenCV hiện được ứng dụng rộng rãi toàn cầu, với cộng đồng hơn 47.000 người, với nhiều mục đích và tính năng khác nhau từ interactive art, đến khai thác mỏ, khai thác web map hoặc qua robotic cao cấp.
Ứng dụng của OpenCV là gì?
OpenCV được sử dụng cho đa dạng nhiều mục đích và ứng dụng khác nhau bao gồm [1] :
Hình ảnh street view
Kiểm tra và giám sát tự động
Robot và xe hơi tự lái
Phân tích hình ảnh y học
Tìm kiếm và phục hồi hình ảnh/video
Phim – cấu trúc 3D từ chuyển động
Nghệ thuật sắp đặt tương tác
Tìm hiểu thêm các API hàng đầu của Computer Vision TẠI ĐÂY
Tính năng và các module phổ biến của OpenCV
Theo tính năng và ứng dụng của OpenCV, có thể chia thư viện này thánh các nhóm tính năng và module tương ứng như sau:
Xử lý và hiển thị Hình ảnh/ Video/ I/O (core, imgproc, highgui)
Phát hiện các vật thể (objdetect, features2d, nonfree)
Geometry-based monocular hoặc stereo computer vision (calib3d, stitching, videostab)
OpenCV có cấu trúc module, nghĩa là gói bao gồm một số thư viện liên kết tĩnh (static libraries) hoặc thư viện liên kết động (shared libraries). Xin phép liệt kê một số định nghĩa chi tiết các module phổ biến có sẵn [2]như sau:
Core functionality (core) – module nhỏ gọn để xác định cấu trúc dữ liệu cơ bản, bao gồm mảng đa chiều dày đặc và nhiều chức năng cơ bản được sử dụng bởi tất cả các module khác.
Image Processing (imgproc) – module xử lý hình ảnh gồm cả lọc hình ảnh tuyến tính và phi tuyến (linear and non-linear image filtering), phép biến đổi hình học (chỉnh size, afin và warp phối cảnh, ánh xạ lại dựa trên bảng chung), chuyển đổi không gian màu, biểu đồ, và nhiều cái khác.
Video Analysis (video) – module phân tích video bao gồm các tính năng ước tính chuyển động, tách nền, và các thuật toán theo dõi vật thể.
Camera Calibration and 3D Reconstruction (calib3d) – thuật toán hình học đa chiều cơ bản, hiệu chuẩn máy ảnh single và stereo (single and stereo camera calibration), dự đoán kiểu dáng của đối tượng (object pose estimation), thuật toán thư tín âm thanh nổi (stereo correspondence algorithms) và các yếu tố tái tạo 3D.
2D Features Framework (features2d) – phát hiện các đặc tính nổi bật của bộ nhận diện, bộ truy xuất thông số, thông số đối chọi.
Object Detection (objdetect) – phát hiện các đối tượng và mô phỏng của các hàm được định nghĩa sẵn – predefined classes (vd: khuôn mặt, mắt, cốc, con người, xe hơi,…).
High-level GUI (highgui) – giao diện dễ dùng để thực hiện việc giao tiếp UI đơn giản.
Video I/O (videoio) – giao diện dễ dùng để thu và mã hóa video.
GPU – Các thuật toán tăng tốc GPU từ các modun OpenCV khác.
… và một số module hỗ trợ khác, ví dụ như FLANN và Google test wrapper, Python binding, v.v.
OpenCV hiện tại hỗ trợ nhiều ngôn ngữ, mỗi ngôn ngữ có thế mạnh riêng, vậy thì tùy theo nhu cầu mà chọn ngôn ngữ cho phù hợp.
C++: Đây là ngôn ngữ phổ biến nhất hiện tại vì nhanh, nhiều option, nếu bạn có IDE là Visual Studio quá tốt. Các thiết lập của nó rất hữu ích cho sản phẩm sau này, mặc dù ban đầu mới đụng tay khá phức tạp
Python: Ngôn ngữ được dùng nhiều để demo / test OpenCV do tính ngắn gọn, ít phải thiết lập. Bên cạnh đó, nếu dùng Python thì cũng có thể code được trên nhiều hệ điều hành.
Android: Hiện tích hợp sẵn camera, tiện lợi nên có thể sớm trở thành xu hướng của OpenCV
Java: Nhanh và đa nền tảng, tương tự C++
C#: Code tiện lợi, dễ dàng, có thư viện đa nền tảng là EmguCV hỗ trợ. Có một điểm trừ là EmguCV yêu cầu người dùng phải copy toàn bộ file *.dll của lib đi kèm với ứng dụng nên làm ứng dụng sẽ khá nặng.
Tùy theo nhu cầu và tính chất của công việc / dự án mà bạn hãy chọn ngôn ngữ phù hợp. Ví dụ có thể xử lý hình ảnh bằng C++, thiết kế UX / UI thì chuyển sang C# cho dễ thiết kế. Riêng demo chương trình có thể chạy ngay bằng Python hoặc android. Ngôn ngữ nào cũng có điểm cộng điểm trừ, hãy cân nhắc tuỳ project cho phù hợp.
Tại trường “Where is the source code”, chọn địa chỉ source code trong thư mục OpenCV vừa cài đặt là E:/opencv/sources, và trường “Where to build the binaries” tại một thư mục sẽ sử dụng để build. Ở đây mình chọn là E:/opencv/build/x86.
Sau khi chọn xong ấn vào nút Configure. Các bạn chọn genertor bằng MinGW Makefiles
Chú ý: Khi hiển thị config lên, các bạn nhớ bỏ chọn dòng ENABLE_PRECOMPILED_HEADERS
Ấn nút Generate
Sau khi CMake tạo xong, các bạn hãy chạy lệnh mingw32-make từ thư viện MinGW vừa cài.
Nếu các bạn muốn chạy nhiều core (tăng tốc thực hiện), có thể thực hiện lệnh mingw32-make -j4 (-j4 ở đây mang ý nghĩa build trên 4 core CPU)
Chú ý: Khi gặp phải lỗi khi build module videoio, hãy mở đến file cap_dshow.cpp và thêm dòng code sau trên đầu file #define STRSAFE_NO_DEPRECATE
Tự học OpenCV ở đâu?
Không thiếu tài liệu ngon để khởi động đâu! Bạn hoàn toàn có thể bắt đầu từ các tài liệu và document chính thức từ OpenCV luôn.
Nếu bạn làm trên C và C++ bạn có thể follow các document sau:
Ngoài ra có rất nhiều hướng dẫn có sẵn. Giống như một ngôn ngữ lập trình thôi, bạn nên bắt đầu viết chương trình dùng OpenCV ngay sau khi bạn bắt đầu học. OpenCV hỗ trợ nhiều IDE để làm việc. Microsoft Visual Studio là hỗ trợ tốt nhất tốt nhất. Nhận thêm các visual studio và OpenCV và configure theo link sau:
Bạn có thể sử dụng Code Blocks hoặc Eclipse hoặc các IDE khác cũng được nhưng Visual Studio tốt bởi vì nó là dễ sử dụng hơn và là một IDE mạnh. Viết application là việc quan trọng nhất của bất kỳ ngôn ngữ lập trình hoặc thư viện nào. Vì vậy, đừng chần chừ mà tìm hiểu và code luôn. Bắt đầu viết application ngay khi bạn bắt đầu học. Nếu bạn gặp bất kỳ lỗi hoặc nhầm lẫn hoặc nghi ngờ nào, có rất nhiều diễn đàn có sẵn để support cho OpenCV, nơi bạn có thể làm rõ tất cả các thắc mắc:
Ngoài những cái này thì nếu bạn có phải làm việc về xử lý hình ảnh thì quá tốt vì từ đó bạn nhanh hiểu hơn về cách thức và cơ chế hoạt động của OpenCV.
Một số tài nguyên bên lề cho bạn tham khảo dưới đây, miễn đừng lười nhé!