Bài viết dịch lại của một anh làm product design cho facebook đăng tải trên medium
Khi chưa vào làm cho Facebook, tôi chưa hề biết thế nào gọi là thiết kế để giải quyết vấn đề cho người sử dụng.
Tôi học được rằng giải quyết vấn đề cho người sử dụng không bao giờ là công việc đo từng ly từng tí pixel được thiết kế, nó đòi hỏi phải làm việc như một phần của team để tìm ra cách giải quyết.
Ngày xửa ngày xưa tôi rất thích các trang web với nhiều hiệu ứng lạ mắt, những logo ý nghĩa, những bản thiết kế làm lại (re-design) của những designer từ khắp nơi cho những trang web nổi tiếng,… . Ngày xưa tôi từng mơ ước trở thành kế toán, tôi thích trở thành người giữ tiền cho các công ty lớn, thế rồi tôi thấy những thiết kế lộng lẫy đó trên mạng, tôi nghĩ rằng, chắc đây có thể là một công việc với nhiều điều thú vị hơn một kế toán viên.
Giờ khi tôi đã là product design cho các sản phẩm của Facebook, với hơn 2 tỷ người người sử dụng, tôi biết rằng những gì tôi từng tưởng tượng trước đây về thiết kế chỉ là phần nổi của tảng băng chìm.
Thiết kế tốt hơn phải giải quyết một vấn đề thực tế của người sử dụng
Khi mới bắt đầu, tôi dành thời gian hàng đêm để làm những website, ứng dụng nhỏ, những dự án chẳng ai biết tới, những ý tưởng rất ngô nghê như ứng dụng hẹn hò dựa trên kết quả tìm kiếm.
Lúc đó tôi đã nghĩ rằng mình là product design thực thụ. Tôi vẽ ra tất cả các màn hình, flows cho ứng dụng, và tự nhủ rằng đã xong hết 90% của công việc, phần còn lại là quăng hết đống design đó cho các anh lập trình viên code đúng theo thiết kế này và hiển nhiên ngồi bắt bẻ các anh lập trình không làm đúng ý tôi.
Giờ nhìn lại, những gì trước đây mình làm còn rất xa so với công việc của product design, trước khi làm việc cho Facebook, tôi chưa bao giờ bỏ thời gian ra để xác định vấn đề cần giải quyết ở đây là gì trước khi bắt tay vào làm, tôi chỉ muốn làm cái gì đó thật “ngầu” để trưng lên Dribbble hay Behance để câu like.
Giờ tôi không còn lơ lửng trên 9 tầng mây, tôi phải đứng cùng vị trí với người sử dụng, tôi cùng các đồng nghiệp của mình cùng nhau xác định bài toán đặt ra là gì, đưa ra một giải pháp được cho là khả thi nhất dựa trên dữ liệu chúng tôi có được, test thử giải pháp trên một số lượng nhỏ người sử dụng trước khi đưa nó vào vận hành chính thức.
Giờ tôi cũng rất dễ bị hấp dẫn bởi các xu hướng thiết kế mới, nhưng không bao giờ áp những xu thế này để giải quyết các vấn đề mà không cần suy nghĩ, nó là một hành động ảnh hưởng xấu đến những người trong team đã và đang đối mặt với vấn đề đó hằng ngày, họ biết rõ vấn đề cần giải quyết là gì hơn ai hết, nó giống như câu nói “nếu ai cũng có cây búa trong tay, thì mọi thứ chỉ như cái cán búa”.
Product Manager và Lập trình viên luôn là bạn tốt nhất
Tôi từng tưởng tượng, tôi sẽ trang bị cho những designer là cấp dưới, đồng nghiệp của tôi những vũ khí ‘hạng nặng’ để đối phó với bên kia chiến tuyến là các anh lập trình viên cù lần. Chúng tôi sẽ cùng nhau thương thảo những vấn đề cực quan trọng như nên sử dụng màu gradient nào đang là hot trend bây giờ, hay tạo ra cái mới, bo tròn bao nhiêu là đủ, bao nhiêu là quá lố…
Ở Facebook, rất nhiều cơ hội để làm việc với các designer khác. Tôi ngồi ngay kế vài anh lão làng như thế trong công ty, thế nhưng mấy anh này lại làm việc trên các sản phẩm khác, nên tôi chỉ tiếp xúc nhiều với product manager và các lập trình viên.
Một designer chỉ tập trung cho một sản phẩm nào đó của Facebook, vì với độ lớn của sản phẩm mà chúng tôi đang làm, nếu các anh designer cứ nhảy từ team này qua team khác, sẽ mất khá nhiều thời gian để người mới có thể bắt kịp tốc độ dự án.
Product manager là người nắm rõ nhất những gì các team đang làm. Vì thế tôi luôn tin tưởng tìm đến anh ấy khi cần một cái nhìn khác về thiết kế của mình hay những gì tôi nên tập trung nhiều hơn trên sản phẩm cần đạt được.
Làm việc với mấy anh cù lần ‘developer’ giúp tôi trở nên tốt hơn rất nhiều, mấy anh chỉ cho tôi rất nhiều điều mà tôi không lường trước. Ví dụ, tôi thường không quan tâm đến thời gian phản hồi từ điện thoại đến server, các phác thảo của tôi gần như chỉ tính đến chuyện click-response ngay lập tức. Các anh dev cho tôi thấy việc truyền gửi dữ liệu cần tốn một thời gian nhất định và còn phụ thuộc yếu tố mạng nhanh hay chậm, anh cho tôi thấy sự khác biệt trải nghiệm rõ rệt khi mở ứng dụng của tôi với mạng siêu nhanh của công ty và mạng rùa bò ở các nước có đường truyền thấp.
Sản phẩm khi thiết kế luôn chịu ảnh hưởng của yếu tố technical, ở Facebook chúng tôi luôn đưa anh lập trình vào trong quá trình thiết kế ngay từ giai đoạn đầu của design, làm như vậy để biết được những ràng buộc nhất định về mặt kỹ thuật, lắng nghe cách giải quyết vấn đề từ góc nhìn từ developer.
Tôi có thể ngồi kế rất nhiều designer khác, nhưng người bạn thân thiết giúp sản phẩm của tôi tốt hơn là các anh developer và product manager
Bạn đang thiết kế sản phẩm cho người sử dụng hoàn toàn khác bạn
Trừ trường hợp bạn tự làm tự xài, đa phần các sản phẩm được thiết kế ra được dành cho những người không am hiểu thiết kế, phần lớn người sử dụng sản phẩm Facebook nằm ngoài nước Mỹ, không sử dụng con Iphone đẳng cấp nhất thời đại mà tôi đang sử dụng.
Team UX research ở Facebook luôn biết sản phẩm chúng tôi đang tạo ra cho ai sử dụng, họ mời những con người thật với nhiều tiêu chí khác nhau đến phòng labs để kiểm thử chức năng mới, nói chuyện với những người sử dụng từ nửa vòng trái đất, đo lường ảnh hưởng của những thay đổi trong sản phẩm bằng những đánh giá được gửi đi khắp nơi.
Với những “chứng cứ” người thật việc thật, những người gặp rắc rối khi thực hiện một tác vụ được thiết kế, chúng tôi có được những giải pháp nhanh nhất từ những lập trình viên ưu tú.
Ví dụ, thông qua research chúng tôi mới thấy được cái nút nhỏ xíu “Add Friend” có thể tốt trên tiếng anh nhưng với những ngôn ngữ khác lại không ổn.
Thiết kế sẽ được cân đo đong đếm
Khi ngồi nhà thiết kế cho chính mình, tôi chẳng bao giờ nghĩ tới chuyện đi cân đo các thiết kế của mình, phần lớn khi ra quyết định một thiết kế được đưa ra dựa trên sở thích cá nhân nhiều hơn trên những số liệu, căn cứ thực tế.
Ở Facebook tôi học được rằng trước khi muốn giải quyết vấn đề nào đó chúng tôi cần dựa trên những thông tin liên quan về vấn đề đó. Ai sử dụng tính năng này? Bao nhiêu người sẽ chịu ảnh hưởng từ các thay đổi được đưa ra? Những thay đổi tích cực có đủ lớn để chấp nhận rủi ro cho những thay đổi này không?
Dữ liệu luôn là kẻ chiến thắng trong mọi cuộc tranh cãi. Đó là câu khẩu hiệu ở Facebook, nếu bạn là designer làm việc ở đây, nếu muốn tranh cãi vấn đề vì đó tốt hơn hãy có dữ liệu cụ thể để thuyết phục đồng đội.
Khi team tôi bắt đầu đi lòng vòng quanh một vấn đề mà chưa ngã ngũ, tôi thường sử dụng câu hỏi “Tại sao”. Tại sao chẳng ai vào mục Giúp đỡ trên website của bạn? Phải chăng họ quá rành không cần vào xem hay họ chẳng biết vào đó bằng cách nào?
Công việc này không như bạn đã nghĩ
Tôi đã từng nghĩ công việc của một product design phần lớn là để làm cho sản phẩm được đẹp một cách “lồng lộn”. Từ ngày bị lôi vào Facebook tôi nhận ra mình đã hiểu sai khái niệm về product design.
Visual designer mới làm công việc trang điểm cho sản phẩm, công việc của tôi là phối hợp với đồng nghiệp của mình, xác định bài toán mà người sử dụng sản phẩm chúng tôi muốn giải quyết, chuyển nó thành những giải pháp thiết kế tốt nhất có thể, tìm ra cách đánh giá để biết chúng tôi có thành công trong việc giải quyết vấn đề đó không.
Bài viết của: Jason Cashdollar | Product designer at Facebook
Theo số liệu do HackerRank công bố, hiện nay HackerRank đã xếp hạng hơn 1,5 triệu developer toàn cầu dựa trên tốc độ và độ chính xác. Những kết quả gần đây cũng cho thấy Trung Quốc là quốc gia có lập trình viên xếp thứ hạng cao nhiều nhất, sau đó là Nga và Ba Lan.
HackerRank là gì?
Những công ty lớn như Amplify, Quora và Capital One đều đang sử dụng HackerRank for Work – cho quá trình tuyển dụng mảng kỹ thuật. Ngoài là thuớc đo kỹ năng, HackerRank cũng tổ chức một số chương trình hackathons, như CodeSprints, cũng là một cách để các công ty tìm kiếm những ứng viên tiềm năng.
HackerRank là một website cho phép các lập trình viên trau dồi, học hỏi và rèn luyện kỹ năng của bản thân. Website này sẽ yêu cầu những người tham gia đưa ra lời giải cho những “thử thách lập trình” hay những bài toán lập trình. Qua đó những kết quả và tốc độ giải đáp vấn đề sẽ được HackerRank sử dụng để đánh giá và xếp hạng các lập trình viên tham gia.
Ngoài việc ghi điểm trong mắt nhà tuyển dụng, các developer cũng có thể luyện code trên HackerRank. Những ưu điểm có thể kể về HackerRank như là: HackerRank có hệ thống compiler online, từ đó không cần cài thêm bất kỳ compiler nào trên máy và có thể lâp trình trực tiếp trên Web. Thứ hai, HackerRank có đa dạng các bài code (có sẵn cả unit test để biết đúng sai) để các coder luyện tập và thử sức. Sau khi cải tiến bản thân qua các bài code, các coder có sẵn nguồn các bài thi tuyển dụng của các công ty lớn toàn thế giới.
Lưu ý khi học code trên HackerRank
function Rectangle(a, b) {
}
Đây là dòng đầu tiên của một hàm mà họ yêu cầu bạn viết trong 10 Days of Javascript. Viết đối tượng hình chữ nhật là ngày thứ 4 trong 10 ngày. Hầu hết các coder sẽ dùng tiếp dòng đầu tiên này và điền vào chỗ trống những gì còn thiếu giữa hai dấu {}. Đây có lẽ cũng là điều mà HackerRank mong đợi.
Nhìn dòng đầu tiên này thì bạn có thể hiểu rằng a là một cạnh của hình chữ nhật và b là cạnh còn lại. Nếu bạn đọc mô tả đề bài, thì sẽ biết rõ ràng rằng a là chiều dài của hình chữ nhật và b là chiều rộng.
Tại sao lại cần bí mật?
Batman cần giữ kín danh tính của mình vì anh thường dành buổi tối để làm những việc phạm pháp, dù đó là việc tốt, anh ấy vẫn có thể bị bắt. Để có thể được tự do và mang đến công lý cho người khác, anh ấy không thể để người khác biết rằng mình chính là Bruce Wayne.
Nhưng, a và b ở đây không cần giữ bí mật danh tính thực sự của chúng (chiều dài và chiều rộng của hình chữ nhật). Trên thực tế, tất cả những gì chúng sẽ làm trong hàm này là chiều dài và chiều rộng của hình chữ nhật. Điều đó có nghĩa là chúng không cần phải là a và b. Vậy tại sao chiều dài không thể là length (chiều dài trong tiếng Anh) và chiều rộng là width (chiều rộng)?
Tác hại của cách đặt tên đó là gì?
Trong bài tập HackerRank này, bạn sẽ chỉ viết vài dòng code thôi. Chưa kể hai tham số logic duy nhất để tạo một hình chữ nhật là chiều dài và chiều rộng của nó. Bạn có thể sẽ không quên a và b là gì trong đoạn code. Mặc dù vậy, không chỉ có bạn đọc code của bạn, vẫn còn những người khác nữa và có thể nhiều người trong số họ không thể biết được a và b là gì.
Bạn có thể cảm thấy đoạn code rất ngắn gọn và thông minh, và dường như HackerRank làm vậy rất ổn.
OK, nhưng nghĩ một chút xem, trong công việc có bao giờ bạn viết app, chương trình nào mà lại có ít code như vậy không? Nếu là một ứng dụng có 10.000 dòng code, mỗi hàm có các tham số với chữ cái a, b, c, d, e thì câu chuyện sẽ rất khác. Bạn có thể đọc hiểu code này vì bạn viết ra nó, nhưng nếu ai đó được bàn giao code này từ bạn có lẽ họ sẽ vừa đọc vừa chửi thầm trong bụng.
Bạn có thể nghĩ Devon khó tính hoặc tìm đúng ví dụ tệ nhất trên nền tảng này để chê bai. Tất nhiên, không phải mọi bài tập trên HackerRank đều sử dụng tên biến tối nghĩa, nhưng có nhiều bài tập như vậy. Đây là một ví dụ khác:
'use strict';
process.stdin.resume();
process.stdin.setEncoding('utf-8');
let inputString = '';
let currentLine = 0;
process.stdin.on('data', inputStdin => {
inputString += inputStdin;
});
process.stdin.on('end', _ => {
inputString = inputString.replace(/\s*$/, '')
.split('\n')
.map(str => str.replace(/\s*$/, ''));
main();
});
function readLine() {
return inputString[currentLine++];
}
// Complete the minimumBribes function below.
function minimumBribes(q) {
}
function main() {
const t = parseInt(readLine(), 10);
for (let tItr = 0; tItr < t; tItr++) {
const n = parseInt(readLine(), 10);
const q = readLine().split(' ').map(qTemp => parseInt(qTemp, 10));
minimumBribes(q);
}
}
Nhiều biến trong code trên không hề dễ hiểu, t là gì, q là gì, n là gì, tItr là gì… Mục đích chính mà tác giả muốn nói ở đây chỉ là hãy đặt tên biến cho rõ ràng, hãy viết code sao cho ai mới đọc cũng có thể mường tượng được hàm này làm gì, biến này là cái gì mà thôi. Vì sao cần phải như vậy?
Viết code là dành cho con người
Bạn có thể nghĩ rằng code dành cho máy tính. Không phải đâu. Code dành cho con người. Nếu nó dành riêng cho máy tính, chúng ta không cần ngôn ngữ cấp cao như Javascript hay Python.
Hãy ghi nhớ điều này khi bạn viết code: Viết làm sao để người khác đọc code bạn viết mà họ hiểu được. Các tên biến, tham số và hàm nên chứa càng nhiều ngữ cảnh càng tốt để giúp người đọc hiểu những gì họ đã đọc. a là một tên biến rất tệ. length là tên biến tốt và lengthInInches thậm chí còn tốt hơn (nếu bạn mong đợi phép đo được tính bằng inch). Nếu code thay đổi, hãy đảm bảo bạn cập nhật các tên đã đặt để phản ánh những gì chúng đại diện.
Vì HackerRank là một công ty lớn, có uy tín, nên việc bạn có code được đánh giá tốt trên nền tảng này cũng khiến các nhà tuyển dụng chú ý hơn.
Chỉ là, khi bạn thực hành trên HackerRank, hãy rèn cho mình thói quen tái cấu trúc những cái tên vô nghĩa khủng khiếp thành một cái tên có thể truyền đạt ý nghĩa và bối cảnh cần thiết để đọc code. Khi bạn làm việc với các dự án bên ngoài nền tảng, đừng để cho việc đặt tên tối nghĩa làm hại code của bạn và mang lại cho bạn danh tiếng là một dev viết code không thể đọc nổi.
Bằng cách luôn tâm niệm rằng viết code là để cho người đến sau bạn có thể đọc, bạn không chỉ tạo sự dễ dàng cho các nhà phát triển khác làm việc với bạn mà còn khiến cho khách hàng muốn thuê lại bạn và giới thiệu bạn với các công ty khác cần bạn giúp đỡ.
Có một bình luận vui dưới bài rằng: Khi bước chân vào nghề tôi đã được bảo rằng: “code làm sao để gã sau vào có thể đọc hiểu” và “hãy tưởng tượng người kế thừa đống code của bạn là một gã to cao, nóng tính, biết rõ bạn đang ở đâu” (Nếu hắn đọc không hiểu sẽ tìm đến nhà và cho bạn một trận – người dịch).
Một số lưu ý tổng quan cho các bạn mới gia nhập HackerRank
Trong tương lai sẽ có không ít các công ty công nghệ tiến hành ứng dụng HackerRank như một bước để đánh giá trong quy trình tuyển ứng viên IT, thì đừng quên lưu ý một số mẹo nhở dưới đây khi bắt tay vào thử HackerRank:
Các thử thách và bài test đều tính giờ, hãy tập trình cao độ và không được xao nhãng.
20–30% tỉ lệ thành công đến từ việc hiểu rõ với hệ thống. Trước khi chính thức đi vào challenge có thể thử sức một số cái trước, vd:Khởi động bằng miền của các thuật toán. Phải chắc chắn rằng bạn nắm bắt được cách viết và submit code.
Biết các ngôn ngữ có sẵn để test.
Thường trong mỗi challenge sẽ có nhiều vấn đề cần giải quyết, và nếu bắt đầu từ bài khó nhất sẽ không hợp lý. Cách tốt nhất phải là xử lý lần lượt độ khó tăng dần. Hãy đọc sơ trước và quyết định cách giải quyết sau.
Hãy giảm thiểu thời gian giữa các vấn đề sau khi đã bổ sung. Bạn có thể dành thêm ít thời gian để quyết định xem nó có phải là thành phẩm final hay chưa, và rồi đảm bảo rằng không quay lại nữa.
Mọi vấn đề đều bao gồm giải trường hợp công và trường hợp tư nhân. Điểm của You sẽ dựa trên cả hai. Nếu vấn đề nằm ở chỗ có kiểm tra các phương thức về public và private, điểm của bạn được đánh giá trên cả hai. Trong trường hợp, dù mã bổ sung được thông qua mọi phương thức về public, điều đó không đồng nghĩa với việc sẽ thông qua phương thức về private. Hãy nghiên cứu thêm các trường hợp ở rìa. Vd: kiểm tra xem input có rỗng không; 1,2 hay nhiều yếu tố khác nhau, v. v môi trường HackeRank sẽ cho phép bạn chạy mã trên các test bài tự tuỳ.
Đảm bảo bất cứ gì cho mọi vấn đề. Nếu không biết cách giải quyết bạn vẫn có thể kiếm được vài điểm từ nó. Tuy nhiên, hãy cố gắng giải quyết đúng vấn trọng tâm ít nhất một – hai vấn đề nào đó trong bài.
Trang chủ cần tạo ra sự khác biệt: một vài mẫu template có thể giúp bạn như việc có thể sao chép và dán chúng trong suốt quá trình tham gia challenge. Ví dụ: BFS/DFS/Tìm kiếm nhị phân.
Hãy luyện tập nhiều nhất có thể trong lần đầu tiên. Bạn có thể thử giải quyết ít nhất một vấn đề từ mỗi tên miền phụ của các thuật toán
Một kết quả tốt không phải là một trò ảo thuật, nó cần nhiều sự luyện tập và nỗ lực.
TopDev tổng hợp
Truy cập ngay các công việc IT đãi ngộ tốt trên TopDev
Python là một ngôn ngữ lập trình bậc cao cho các mục đích lập trình đa năng, do Guido van Rossum tạo ra và lần đầu ra mắt vào năm 1991. Python được thiết kế với ưu điểm mạnh là dễ đọc, dễ học và dễ nhớ. Với các đặc điểm gần như là triết lý căn bản của ngôn ngữ Python như: “đẹp đẽ tốt hơn xấu xí, minh bạch tốt hơn che đậy, đơn giản tốt hơn phức tạp, phức tạp tốt hơn rắc rối và dễ đọc” được trình bày trong tài liệu “The Zen of Python”. Ngôn ngữ lập trình Python có hình thức rất sáng sủa, cấu trúc rõ ràng, thuận tiện cho người mới học lập trình. Cấu trúc của Python còn cho phép người sử dụng viết command code với số lần gõ phím tối thiểu. Với việc tài liệu lập trình Python hiện nay tuy có nhiều nhưng tài liệu Python tiếng Việt lại khá ít, hi vọng bài viết tổng hợp dưới đây bao gồm tài liệu tiếng Việt và tiếng Anh sẽ giới thiệu đến các bạn để học tập và trao dồi kiến thức về ngôn ngữ này tốt hơn, dựa theo các tài liệu này các bạn có thể tự học ngôn ngữ lập trình Python từ cơ bản tới nâng cao cũng như được cập nhật kiến thức mới nhất từ các chuyên gia.
Điểm nổi bật nhất của Python so với các ngôn ngữ khác đó chính là nhờ cú pháp cực kỳ đơn giản và thanh lịch, rất thích hợp cho các bạn newbie chưa biết gì về lập trình, nhưng không vì thế mà đánh giá thấp Python vì đây cũng là ngôn ngữ nổi tiếng về sự chặt chẽ, nhanh, mạnh và hiện đã có mặt ở mọi hệ điều hành. Có thể thấy rất nhiều ví dụ từ những trò chơi điện tử đơn giản, cho đến những thuật toán tìm kiếm phức tạp hay nền móng cho các bạn sinh viên ngành Khoa học máy tính, Python là sự lựa chọn hoàn hảo cho mọi lập trình viên, dù bạn là người mới bắt đầu hay đã có thâm niên trong nghề. Đặc biệt là với sự bùng nổ về công nghệ AI – Trí tuệ nhân tạo trong những năm gần đây, cái tên Python liên tục được nhắc đến nhiều hơn bao giờ hết trong lĩnh vực Công nghệ Thông tin.
– Là bước đệm hoàn hảo cho các ngôn ngữ khác vì Python là ngôn ngữ hướng đối tượng được ứng dụng rất đa dạng.
– Được trả lương cao vì tại Mỹ, cùng với Ruby, Python là ngôn ngữ đứng thứ 2 về lương của 1 lập trình viên với khoản $107,000 / năm.
– Thiết thực trong thiết kế web cũng như ứng dụng web vì Django, web framework được viết bởi Python sẽ khiến lập trình web trở nên đơn giản hơn.
– Tương lai của AI và được cung cấp bởi các thư viện đa dạng, phong phú tạo tính linh hoạt của ngôn ngữ, tốc độ xử lý, và các tính năng cho Machine Learning.
Nhược điểm của ngôn ngữ Python
– Tốc độ chậm hơn so với các ngôn ngữ C/C++ hay Java.
– Không phải là ngôn ngữ tốt dành cho nền tảng mobile.
– Python không phải lựa chọn tốt cho các bài toán cần tối ưu bộ nhớ.
– Python có nhiều giới hạn khi làm việc với cơ sở dữ liệu phức tạp.
Ứng dụng trong Machine Learning
Python là ngôn ngữ lập trình phổ biến nhất được sử dụng trong Machine Learning và thị giác máy tính: SciPy là một gói thư viện dành cho toán học, khoa học và kỹ thuật. Pandas là một thư viện dành cho phân tích dữ liệu. scikit-learn là một thư viện dành cho ML.
Và rất nhiều ứng dụng trong các lĩnh vực khác như phân tích dữ liệu – data analysis, tự động hóa – automation, test tự động – selenium, IOT…
Python ….Rất là cơ bản của tác giả Võ Duy Tuấn. 1 trong những tài liệu tiếng Việt hiếm hoi và khá đáng giá về Python. Sách được chia làm 15 chương, mỗi chương sẽ trình bày 1 khía cạnh của Python mà bạn sẽ gặp phải và sẽ hữu ích khi biết các kiến thức này trong việc áp dụng Python vào công việc trong tương lai.
Nội dung bao gồm: Hello world, Cú pháp, Phân chia module, Class, Kết nối MySQL, Kết nối Redis, Kết nối Memcached, Kết nối RabbitMQ, Restful, Client, Thao tác trên tập tin, Xử lý hình ảnh, Xử lý file JSON, Xử lý file XML, Gởi email với SMTP Socket Programming…
Với tài liệu Python hiện nay chủ yếu là tiếng Anh, tài liệu miễn phí bằng tiếng Việt này sẽ giúp bạn nhanh chóng tự học ngôn ngữ lập trình Python.
A Byte of Python
Đây là quyển sách lập trình Python hoàn toàn miễn phí. Được xem như bài hướng dẫn cho những người mới bắt đầu về lập trình đến với ngôn ngữ Python. Nếu như bạn chỉ biết mỗi việc lưu các tệp văn bản trên máy tính thì đây chính là quyển sách dành cho bạn. Ngoài ra quyển này còn chỉ cho bạn cách sử dụng Python version 3, cũng như cách làm quen với phiên bản cũ hơn như Python version 2.
Think Python 3rd Edition
Quyển Think Python sẽ giới thiệu các bạn mới bắt đầu đến việc lập trình bằng ngôn ngữ Python. Nó bắt đầu với những ý tưởng cơ bản của lập trình, và được thiết kế cẩn thận để xác định tất cả các điều khoản khi nó được sử dụng trước tiên và để lập trình mỗi ý tưởng mới trong tiến trình logic. Với những phần lớn hơn, như đệ quy hay lập trình hướng đối tượng được chia ra thành chu kỳ nhỏ với từng bước nhỏ và được giới thiệu xuyên suốt khóa học qua các chương. Ngoài ra sách của sử dụng Python 3, hướng dẫn chạy Python trên trình duyệt hiện có, giới thiệu các tính năng thú vị của Python như cấu trúc dữ liệu bổ sung, list comprehension và các bài tập đòi hỏi tư duy rất thú vị.
Automate the Boring Stuff with Python
Nếu bạn từng tốn hàng giờ liền chỉ để đổi tên các tệp hay cập nhật hàng trăm cột spreadsheet, thì hẳn bạn cũng đã quá ngán ngẩm với những task tẻ nhạt này. Nhưng không sao vì giờ đây bạn đã có chiếc máy tính để làm những điều này thay bạn. Trong quyển sách này, bạn sẽ học cách sử dụng Python để viết các chương trình mà có thể hoàn thành những việc bạn mất hàng giờ để làm chỉ trong vài phút! 1 khi bạn đã thành thục các kỹ năng cơ bản của lập trình, bạn sẽ tạo ra được các chương trình Python mà sẽ thực thi 1 cách dễ dàng việc tự động hóa 1 cách hữu ích và ấn tượng.
Ngoài ra quyển này cũng thích hợp cho các newbie, bạn không cần kinh nghiệm về lập trình để bắt đầu cũng như giúp bạn viết các chương trình hết sức thực tiễn và thấy được ngay kết quả.
Dive into Python 3
Dive into Python 3 của Mark Pilgrim là 1 quyển hướng dẫn thực tế tới Python 3 và sẽ khác với quyển tiền nhiệm của nó là Python 2. Mỗi chương bắt đầu với 1 code hoàn chỉnh như 1 thí dụ, tiến hành phân tích và giải thích từng phần, và sau đó đặt tất cả lại cùng nhau với phần tóm tắt ở cuối chương. Ngoài ra quyển còn đi kèm các ví dụ chương trình được viết lại hoàn toàn để minh họa các ý tưởng mới mạnh mẽ đang có sẵn trong Python 3 như set, iterator, generator, closure, comprehension và các trường hợp chi tiết của việc chuyển 1 thư viện chính từ Python 2 sang Python 3. 1 phục lục toàn diện về tất cả các thay đổi cú pháp và ngữ nghĩa trong Python 3. Đây chắc hẳn phải là resource hoàn hảo cho bạn nếu bạn cần phải chuyển các ứng dụng của mình sang Python 3, hoặc bạn cũng có thể nhảy ngay vào ngôn ngữ Python 3 cách nhanh chóng và tiếp tục ngay lập tức nếu bạn đã có 1 chút kinh nghiệm về lập trình ngôn ngữ C hay Java.
Learn Python the Hard Way
Tác giả Zed Shaw đã hoàn thiện hệ thống tốt nhất thế giới cho việc học Python của bạn. Theo từng bước của quyển sách và bạn sẽ thành công như hàng trăm ngàn newbie khác mà Zed đã chỉ dạy. Chỉ cần bạn có sự kỷ luật, cam kết và kiên trì, tác giả sẽ cung cấp cho bạn mọi thứ còn lại. Trong quyển Learn Python the Hard Way tái bản lần thứ 3 này, bạn sẽ học Python bằng cách luyện tập với 52 bài tập thủ công tinh tế. Hãy đọc chúng. Gõ lại chính xác (không xài copy – paste đâu nhá). Sửa lỗi của mình. Quan sát chương trình chạy. Và làm như thế, bạn sẽ học được cách phần mềm làm việc; 1 chương trình tốt sẽ trông ra sao; cách đọc, viết và nghĩ về code; và cách để tìm và fix lỗi bằng cách dùng các mẹo mà những lập trình viên chuyên nghiệp khác đang sử dụng. Quan trọng nhất, bạn sẽ học cách làm theo các bước vốn sẽ cần để bắt đầu viết các phần mềm Python xuất sắc của riêng bạn. Sẽ có khó khăn lúc mới bắt đầu, nhưng dần dần bạn sẽ bắt kịp và cảm thấy thật tuyệt! Bài hướng dẫn này sẽ là phần thưởng đền đáp cho từng phút bạn đã bỏ ra. Nhanh chóng thôi bạn sẽ biết rõ về 1 trong những ngôn ngữ mạnh mẽ và phổ biến nhất thế giới và sớm trở thành 1 lập trình viên Python chuyên nghiệp.
Invent Your Own Computer Game with Python
Tác giả chia sẻ: “Tôi là AI Sweigart, và tôi viết sách để dạy các bạn mới bắt đầu học code. Tôi đưa chúng lên mạng 1 cách hoàn toàn miễn phí vì việc lập trình khá là quý báu và mọi người cần phải được tiếp cận nó.”
Học lập trình sẽ giúp bạn thông minh hơn và phát triển khả năng của bạn. Ngành khoa học tên lửa sử dụng lập trình, nhưng lập trình chưa chắc là ngành khoa học tên lửa. Dù bạn là 1 học sinh / sinh viên đang chuẩn bị cho 1 sự nghiệp trong ngành lập trình, hay 1 nhân viên văn phòng với hàng tá thư mục đầy ắp các tệp spreadsheet, hoặc chỉ đơn giản là người có sở thích làm ra các trò chơi điện tử thì ngôn ngữ lập trình Python là 1 khởi đầu xuất sắc cho bạn tới thế giới lập trình. Ngược lại với hầu hết sách khác chỉ đưa ra lý thuyết là chính, quyển này sẽ hướng dẫn cho bạn viết các trò chơi mini như các trò chơi trên nền tảng DOS ngày xưa cũng như tương tác thú vị với các dòng lệnh. Chi tiết, cặn kẽ và dễ hiểu là những ưu điểm của quyển này và ngay cả các học sinh nhỏ tuổi từ 10-12 tuổi cũng có thể học được.
Making Games with Python and Pygame
Nếu bạn đã hoàn thành quyển trên, thì đây sẽ là phần tiếp theo mà bạn nên tiếp tục và nó cũng dành cho độ tuổi đa dạng như quyển trước. Making Games with Python & Pygame bao gồm thư viện Pygame với hơn 11 source code của các trò chơi điện tử. 1 khi bạn đã hiểu rõ phần căn bản của lập trình Python, giờ đây bạn có thể mở rộng khả năng của mình bằng cách dùng thư viện Pygame để làm ra các trò chơi 2D với đồ họa, hoạt hình và âm thanh. Với hơn 11 source code trò chơi là bản clone của các trò kinh điển như Nibbles, Xếp Gạch, Simon, Xếp kim cương, Othello, Connect Four, Flood it, và còn nhiều nữa.
SÁCH PYTHON NÂNG CAO
Learning Python 5th Edition
1 khi bắt tay vào quyển sách này, nó sẽ giới thiệu toàn diện, chuyên sâu về cốt lõi của ngôn ngữ Python đến cho bạn. Dựa trên các khóa học nổi tiếng của tác giả Mark Lutz, tái bản lần thứ 5 này sẽ nhanh chóng giúp bạn viết code hiệu quả, chất lượng cao bằng Python. Là 1 cách lý tưởng để bắt đầu, dù bạn chỉ biết 1 chút về lập trình hay đã là 1 lập trình viên chuyên nghiệp đã thông thạo các ngôn ngữ khác. Hoàn tất nó với các câu đố vui, bài tập và minh họa hữu ích, bài hướng dẫn khá dễ dàng để làm theo và bắt nhịp này sẽ giúp bạn bắt đầu với Python 2.7 và 3.3 – những phiên bản mới nhất của Python 2 và 3, cộng thêm tất cả các bản phát hành khác thường dùng ngày nay. Bạn cũng sẽ học những tính năng vượt trội của ngôn ngữ mà gần đây đã trở nên thông dụng trong code Python. Tuy khá dài và nhiều chữ nhưng quyển sách rất chuyên sâu này sẽ cho bạn 1 nền tảng vững chắc về Python. Rất phù hợp cho những bạn đã có kinh nghiệm về lập trình, nhất là về lập trình hướng đối tượng.
Effective Python
Khá dễ dàng để bắt đầu với việc viết code bằng Python: đó cũng là lý do tại sao nó lại phổ biến đến như vậy. Tuy nhiên, Python có sức mạnh, độ quyến rũ và biểu cảm đặc trưng vốn có thể khó nắm bắt vào lúc mới bắt đầu, cũng như những cạm bẫy tiềm ẩn có thể dễ dàng khiến bạn vấp ngã nếu không hiểu rõ về chúng. Effective Python sẽ giúp bạn khai thác toàn bộ sức mạnh của Python để viết ra những code đặc biệt mạnh mẽ, hiệu quả, dễ bảo trì và hoạt động tốt.
Bằng cách viết ngắn gọn, minh họa đơn giản dựa theo phong cách tiên phong của quyển best-selling Effective C++ từ tác giả Scott Meyers, tác giả Brett Slatkin tổng hợp tới tận 59 bài thực hành, mẹo, phím tắt và ví dụ code thực tế tốt nhất từ những chuyên gia lập trình viên. Qua các ví dụ thực tế, Slatkin còn tiết lộ các mẹo hiếm thấy, phức tạp và thành ngữ có tác động mạnh mẽ đến hành vi và hiệu suất của code. Bạn sẽ học và chọn được cách hiệu quả nhất để hoàn thành các task mấu chốt khi gặp phải nhiều sự lựa chọn cùng lúc, và cách để viết code dễ hiểu, dễ duy trì và dễ cải tiến hơn.
Effective Python thích hợp cho những bạn ở trình độ trung cấp và nâng cao. Được chia ra thành nhiều phần nội dung, được miêu tả và minh họa chi tiết. Ngoài việc giúp cải thiện code Python của bạn, nó còn giúp bạn khỏi việc mù quáng làm theo những hướng dẫn rập khuôn, cũng như cho bạn sự thấu hiểu sâu sắc về các lý do kỹ thuật tại sao nó lại như vậy. 11. Python Cookbook
Nếu bạn cần sự giúp đỡ cho việc viết phần mềm bằng Python 3, hay muốn update các code Python 2 cũ của mình, quyển sách này chính là thứ bạn đang tìm. Gói gọn với các công thức thực hành được viết và kiểm tra với Python 3.3, quyển cookbook đặc biệt này dành cho những lập trình viên Python đã có kinh nghiệm, vốn đang muốn tập trung vào các tool hiện đại và thành ngữ. Bên trong quyển sách này bạn sẽ tìm thấy những công thức hoàn chỉnh với hàng tá các chủ đề bao gồm phần cốt lõi của ngôn ngữ Python cũng như các task chung cho lĩnh vực ứng dụng khá đa dạng. Mỗi công thức chứa các ví dụ code mà bạn có thể dùng trong dự án của mình ngay lập tức, kèm theo bài thảo luận về việc bằng cách nào và tại sao giải pháp lại hoạt động như vậy.
Fluent Python
Sự đơn giản của Python giúp bạn trở nên năng suất 1 cách nhanh chóng, nhưng điều này có nghĩa là bạn không sử dụng hết mọi thứ mà nó mang lại. Với quyển gối đầu nằm này, bạn sẽ học được cách viết code Python hiệu quả, ‘idiomatic’ bằng cách tận dụng các tính năng tốt nhất dễ bị bỏ qua của nó. Tác giả Luciano Râmlho sẽ mang bạn qua các thư viện, tính năng cốt lõi của Python, và chỉ cách để code của bạn ngắn, nhanh và dễ đọc hơn cùng 1 lúc. Nhiều lập trình viên Python thâm niên thường cố vặn vẹo Python để phù hợp với các pattern mà họ đã học từ các ngôn ngữ khác và không bao giờ khám phá các tính năng khác của Python vốn nằm ngoài trải nghiệm của họ. Với cuốn sách này, những lập trình viên Python như thế cũng sẽ được hướng dẫn kỹ lưỡng để trở nên thành thạo với những đặc điểm riêng của Python hơn, đặc biệt là Python 3. Để hiểu rõ từng bước và nắm kiến thức Python vững vàng hơn bạn nên đọc 3 tài liệu Python kể trên theo thứ tự 1. Effective Python – 2. Python Cookbook – 3. Fluent Python với độ phức tạp tăng dần.
Rtfm: Red Team Field Manual
Đây là 1 quyển khá là thú vị nếu như bạn cũng tập tành làm hacker! The Red Team Field Manual (RTFM) là 1 sách hướng dẫn kỹ lưỡng và không tì vết đặc biệt dành cho các thành viên Red Team nghiêm túc, (trong thuật ngữ quân sự thì thuật ngữ Red Team thường được sử dụng để xác định các nhóm có tay nghề cao và có tổ chức, hoạt động như các đối thủ và/hoặc kẻ thù hư cấu đối đầu với lực lượng “chính quy” aka Blue Team), những người thường tìm thấy bản thân họ trong 1 nhiệm vụ mà không cần đến Google hay thời gian để scan 1 trang web của ai đó. RTFM bao gồm syntax cơ bản được sử dụng thường xuyên trong các tool dòng lệnh cho Linux và Windows, nhưng nó cũng gói gọn các trường hợp sử dụng đơn lẻ cho các công cụ mạnh mẽ khác như Python và Windows PowerShell. RTFM sẽ liên tục giúp bạn tiết kiệm thời gian tìm kiếm các các nuance – sắc thái khó nhớ của Windows như Windows wmic, tool dòng lệnh dsquery, registry values then chốt, syntax tác vụ theo lịch trình, vị trí khởi động và scripting Windows qua 90 trang ghi chép các lệnh. Bên cạnh 2000 cú pháp và hướng dẫn tương ứng từ cơ bản đến nâng cao, phần quan trọng nhất của quyển này chính là nó còn dạy cho bạn các kỹ thuật mới của Red Team nữa!
Black Hat Python: Python Programming for Hackers and Pentesters
Cách tốt nhất để ngăn chặn các hacker mũ đen chính là tìm hiểu các kỹ thuật & mánh lới của họ, và Python cũng là 1 trong những ngôn ngữ lập trình được đặc biệt ưa chuộng bởi các hacker. Không phải ngẫu nhiên mà Python được chọn để tạo ra các hacking tool mạnh mẽ và hiệu quả, đồng thời nó còn được lựa chọn cho hầu hết các nhà phân tích bảo mật. Nhưng làm thế nào mà điều kỳ diệu này lại xảy ra? Hãy cùng tìm hiểu qua quyển sách này nhé. Trong Black Hat Python, tác phẩm gần đây nhất của Justin Seitz (tác giả của quyển best-selling Gray Hat Python), bạn sẽ khám phá mặt tối hơn trong khả năng của ngôn ngữ Python – viết các trình thám thính network, thao túng các packet, lây nhiễm các máy ảo, tạo ra các trojans vô hình và còn nhiều nữa. Ngoài ra các kỹ thuật nội bộ và những thách thức sáng tạo sẽ đồng hành cùng bạn xuyên suốt, chỉ cho bạn cách để mở rộng hack và khai thác theo cách riêng của bạn. Cuối nhưng không đuối, bạn cũng sẽ được hướng dẫn để kích thích khả năng tạo ra các công cụ mạnh mẽ, vốn là điều không thể thiếu khi nhắc tới offensive security – bảo mật công kích.
KHÓA HỌC PYTHON ONLINE
Real Python Tutorials
Tại khóa học Real Python, bạn có thể học tất cả mọi thứ về Python từ con số 0. Mọi thứ từ phần căn bản nhất của Python, cho tới lập trình web cũng như web scraping hay để trực quan hóa dữ liệu và hơn thế nữa…
Sau khi đã bắt đầu với những kiến thức cơ bản bạn sẽ được tiếp tục làm quen với những web framework phổ biến của Python hiện nay như Django, Flask, web2py. Hay cách sử dụng các tool như Vagrant, Git, Heroku để tạo các ứng dụng bằng Python. 1 trang rất thú vị nhất là cho những bạn lập trình viên cuồng tất tần tật về ngôn ngữ Python.
Python Jumpstart by Building 10 Apps
Đúng với cái tên Python Jumpstart by building 10 Apps, chương trình này sẽ giúp cho bạn sớm làm quen với Python qua các dự án thực tế, thích hợp cho các bạn đã có chút kinh nghiệm về lập trình. Được mở đầu với lời giới thiệu hấp dẫn trên trang TalkPython rằng: “Lập trình thật vui và hữu ích. Học tập để trở thành 1 lập trình viên về phần mềm cũng vui không kém! Khóa học này sẽ dạy cho bạn mọi thứ bạn cần phải biết về ngôn ngữ lập trình Python trong mọi lúc dựng các ứng dụng hấp dẫn và thú vị”, 10 ứng dụng thú vị của quyển sách sẽ bao gồm: Hello World, Đoán số, Ứng dụng sinh nhật, Nhật ký cá nhân, Trang xem dự báo thời tiết, LOLcat Factory, Wizard battle, Ứng dụng tìm tệp, Trang phân tích giá bất động sản, Ứng dụng tìm phim. Ngoài ra các khái niệm được hỗ trợ bởi hình ảnh súc tích cũng như đi kèm phụ đề và transcript.
Code Academy: Learn Python
Nếu bạn chưa biết gì về lập trình thì đây là khóa dành cho bạn, các bài học tương đối đơn giản, dễ hiểu, tương tác cao và hình ảnh bắt mắt. Chức năng code ngay trên trình duyệt mà không cần phải tải về cũng khá là tiện lợi. Còn nếu bạn đã có kinh nghiệm trên 6 tháng thì nó có thể hơi dễ so với bạn. Còn có 1 khóa học tương tự bên Code Schoolnhưng mình nghĩ ở khóa này codeacademy vẫn vui hơn.
Theo mình các khóa này rất hợp cho các bạn tập làm quen với lập trình 1 cách thân thiện nhất, nhất là về phần học lập trình và viết code. Còn bạn đã có nền tảng, thích dựng này nọ thì khóa số 16 vẫn thích hợp hơn.
Python Tutorial for Beginners: Learn Programming in 7 Days
Đây là khóa học trên trang Guru99 cho những bạn mới bắt đầu với lập trình, đặc biệt 23 bài hướng dẫn này hoàn toàn miễn phí và được chia ra rất khoa học như: Căn bản Python, Cấu trúc Dữ liệu Python, Cơ sở Python, Khoa học Dữ liệu Python và đặc biệt “Những thứ bạn phải biết!” khá hữu ích cho việc học Python của bạn. Trang web cũng thiết kế khá vui nhộn và tất cả những gì bạn cần làm là nhập email để đăng ký thôi!
Python for Entrepreneurs
Thêm 1 khóa học thú vị từ trang TalkPython, dành cho những bạn đã có kiến thức cơ bản về ngôn ngữ Python, và Python for Entrepreneurs sẽ giúp bạn phát triển kỹ năng của mình bằng cách mở 1 startup hay kinh doanh trên web nhỏ, cũng như chỉ cho bạn từ cách dựng 1 trang web và mọi thứ bạn cần để biến nó thành 1 online business hoạt động tốt. 20. Intro to Python for Data Science Khóa học này dành cho các bạn theo đuổi ngành Khoa học dữ liệu, như Machine Learning, Deep Learning, Tầm nhìn máy tính hay Phân tích thống kê.. Cách tốt nhất để theo khóa học này là bạn nên thành thục ngôn ngữ Python cũng như 2 thư viện phổ biến nhất của Python là NumPy và SciPy.
Bài này nằm trong loạt bài chuẩn kiến thức để đi thi web mobile specialist của google. Một vài điểm cần nhớ khi thiết kế và làm việc với form
Thiết kế form cần tránh việc bắt user làm tới làm lui, đòi hỏi nhiều thông tin hơn cần thiết, hay cảm giác bị lạc lối giữa một cái form quá dài quá nhiều step
Nguyên tắc chung
Bật autofill trên form đề trình duyệt của user có thể tự điền các field đã biết, hiển thị lại những giá trị mà user đã nhập
Label rõ ràng để user biết mình đang nhập cái gì, ở đâu.
Tránh lặp lại
Ví dụ trên trang đăng ký nếu chúng ta đã cho user nhập first name và last name, có thể cho generate tự động ra một giá trị cho field nickname để đăng nhập. Hoặc trường hợp trên trang checkout, cho phép lưu lại địa chỉ giao hàng cho lần checkout sau.
Để tiết kiệm thời gian tiền bạc cho user, khai thác tính năng autocomplete có sẵn của trình duyệt.
Ta muốn autocomplete giá trị gì thì báo với trình duyệt luôn, hoặc dùng giá trị name='giá trị name chuẩn', hoặc autocomplete='giá trị autocomplete chuẩn'
Với các form được chia làm nhiều step trước khi submit, một thanh trạng thái cho user biết mình đang đến bước nào là bắt buộc.
Giá trị ngày tháng
Trường ngày tháng để user chọn từ lịch, không tách ra thành các input độc lập dạng ngày-tháng-năm, user không cần phải mở một ứng dụng calendar khác đó trên điện thoại, trên máy tính để kiểm tra ngày trước khi chọn.
Sử dụng input type phù hợp
HTML5 hỗ trợ khá nhiều kiểu input, khi cung cấp giá trị type rõ ràng cho input, trình duyệt sẽ biết và hiển thị kiểu keyboard nào cho phù hợp trên điện thoại, cũng như có những validation tích hợp sẵn
type='url'
Chuỗi bắt đầu phải là ‘http://’, ‘ftp://’, ‘mailto:’
type='tel'
Ko có ép một syntax hay validation nào cả, giúp hiện thì bàn phím điện thoại trên mobile
type='email'
Trên mobile nó sẽ hiện sẵn phím @
type='search'
Bàn phím search chuẩn trên từng thiết bị
type='number'
iOS yêu cầu có thêm pattern='\d*' để hiển thị bàn phím số
type='range'
Hiển thị kiếu slider control
type='datetime-local'
Giá trị ngày tháng có timezone
type='datetime'
Giá trị ngày tháng ko có timezone
type='time'
Chỉ có giá trị giờ
type='week'
Chỉ có giá trị tuần
type='month'
Chỉ có giá trị tháng
type='color'
Bảng màu để chọn
Gợi ý thông qua trường datalist
<datalist /> là element cho phép chúng ta cung cấp các giá trị gợi ý với một <input />
<label for="frmFavChocolate">Favorite Type of Chocolate</label>
<input
type="text"
name="fav-choc"
id="frmFavChocolate"
list="chocType">
<datalist id="chocType">
<option value="white">
<option value="milk">
<option value="dark">
</datalist>
User không bắt buộc phải chọn các giá trị trong datalist, chỉ là gợi ý thích thì chọn
Trên thẻ input, nếu muốn input được focus ngay lập tức khi vừa vào trang, như login, focus vào ô username. Thuộc tính autofocus này sẽ tự động bị ignore trên mobile để tránh xuất hiện bàn phím ko cần thiết.
<input type="text" autofocus ...>
Hãy tin vào Chrome
Rất nhiều trường hợp vì customize theo ý design mà tính năng autofill của Chrome không còn chạy đúng, nguyên nhân có thể là
Không sử dụng input chuẩn
Lỗi thường thấy khi phải customize cái dropdown theo design mà không thể dùng thẻ <select />
Dùng placeholder giả
Placeholder giả là gì? Thay vì dùng attribute placeholder, dùng value="First Name" rồi viết javascript để khi focus xóa giá trị này đi.
Tự động copy shipping address vào billing address
Cơ bản thì Autofill của Chrome KO thể chạy được nữa nếu chúng ta cho copy dữ liệu từ shipping address qua billing address bằng javascript
Với function thường giá trị của this khá khó lường, tùy thuộc thời điểm chúng ta gọi nó. Như tình huống sau, nếu không có strict mode, thì giá trị nó là global object (window), còn có strict mode nó sẽ là undefined
function myFunction() {
console.log(this);
}
myFunction();
// => global object (window)
Giá trị nó sẽ tùy thuộc vào ngữ cảnh, như trong trường hợp này, nó chính là object chính chủ của phương thức
Với arrow function, this sẽ luôn bằng với giá trị của function ở ngoài, arrow function không khai báo thêm vùng tự trị riêng (execution context), mà dùng chung với thằng cha
Higher-Order Component (HOC) là kỹ thuật mà các bạn lập trình viên Việt Nam rất thích khi nhắc đến React, riêng mình thì không.
HOC nghe khá trừu tượng và cao siêu, một cái tên sang chảnh cho một cách làm trong React, nó cũng có cái hạn chế và ưu điểm riêng, tuy nhiên thích thì học thôi.
Ôn lại Currying function
Để đọc hiểu bài này dĩ nhiên cần nắm cơ bản ES6, hiểu cà-ri function là thế nào (Currying Functional Programming)
Cà-ri function là cách viết tách một function nhận một đốn…ggggg arguments, tách function đó ra thành nhiều function con, mỗi function nhận 1 argument. Ví dụ
// một hàm sum thông thường
const sum = (a, b) => a + b;
// cà-ri function
const curriedSum = function(a) {
return function(b) {
return (a + b)
}
}
// viết hàm cà-ri bằng arrow function
const curriedSum = a => b => a + b
//gọi hàm cà-ri
curriedSum(4)(5)
Một số cách viết khác của ES6 tìm lại mấy bài cũ của mình đã chia sẻ.
Higher-Order Function
Cái này không mới, trước đây trong javascript vẫn thường viết kiểu truyền một callback function (vì trong javascript function được xem là object nên làm được chuyện này), hay 1 function trả về một kết quả trả về của function khác.
Các hàm như add, multiply chấp nhận số lượng input không giới hạn, hàm calculator sử dụng như một container, làm cha thiên hạ, sai hết đứa này tới đưa khác làm việc, extend thêm một số xử lý trước khi gọi hàm add, multiply
Higher-Order Component
Một higher-order component là một một function nhận vào một component như một argument và trả về “phiên bản mở rộng” của component đó.
Với những trang thương mại điện tử lớn, có những ngày lượt truy cập lên tới hàng triệu mỗi giây. Vậy cách giải quyết của những kiến trúc sư – architect trong những tình huống trên là gì? Cùng trò chuyện cùng anh Trần Phong Phú – Solution Architect đến từ Sendo để học hỏi kinh nghiệm của anh khi đưa ra được cái nhìn tổng quát để có những giải pháp cho từng vấn đề của hệ thống.
Là một công ty công nghệ do chính đội ngũ kỹ sư con người Việt Nam xây dựng nên.
Vai trò và sứ mệnh của Sendo được đóng gói rất đơn giản, dùng thương mại điện tử đại diện cho quốc gia.
Đảm nhận vai trò Solution Architect, công việc của anh xoay quanh:
Đóng góp vào sự phát triển tốt lên mỗi ngày của công ty, theo hướng cải thiện những gì chưa tốt.
Phát hiện ra những yếu tố bất thường để tìm cách giải quyết nó.
Thúc đẩy planning và chiến lược, làm thế nào để giúp công ty phát triển về mặt công nghệ, sự tăng trưởng.
Đáp ứng mục tiêu, thay đổi về mặt tổ chức hay về mô hình hoạt động của công ty.
Một ngày làm việc bình thường của mình là sáng đến công ty, mình tham dự các buổi DSM chung với mọi người để nắm bắt công việc, các issue nào đó. Sau đó mình sẽ tìm kiếm trưởng bộ phận khác để trao đổi và thảo luận vấn đề cần giải quyết như thế nào. Sau đó mình về bàn làm việc của mình cứ như vậy làm việc thôi.
Chia sẻ những kinh nghiệm thực tế tại Sendo
Vào những dịp khuyến mãi lớn (10/10, 11/11,…) lượng người truy cập tăng cao. Vậy làm sao để hệ thống không bị chậm hay bị sập?
Cái này mình nghĩ về mặt kỹ thuật hầu như mọi người đều có sự hiểu biết về hệ thống, nên việc đối phó những cái này như nhau. Ví dụ như Tiki, chương trình “Giựt cô hồn”, phần lớn trong trường hợp này chúng ta chuẩn bị một kịch bản, giả lập tình huống, như vậy chúng ta có thể chuẩn bị hạ tầng, máy móc các tình huống chúng ta phải đối phó với nó, Chúng ta xây dựng các nền tảng như vậy để khi có lượng truy cập vào thì đúng với kịch bản của mình chứ không phải mình bị bất ngờ.
Vì khi hệ thống sập, ví dụ như mình chạy chương trình lúc 12h, nhiều khi nó sập mình mất cả nửa tiếng đến một tiếng khắc phục chuyện đó thì gần như nó qua khung giờ vàng rồi cho nên không cần thiết, cơ bản là các nền tảng phải thiết lập sẵn để đối phó với chuyện như vậy. Nhiều khi chúng ta chỉ muốn 1 thôi nhưng offer lên 5 hoặc 10 luôn thì có thể làm được như vậy.
Tỷ lệ rủi ro bị sập là bao nhiêu khi mà nhiều khi mình chuẩn bị sẵn nhưng có nhiều tình huống phát sinh?
Như nãy mình nói, mình muốn 1 nhưng mình có thể chuẩn bị từ 5 đến 10, cho nên là từ khi mình vào công ty, chưa bao giờ chứng kiến những cái đó, những hậu quả mà không ai nghĩ sẽ diễn ra. Về mặt hệ thống, sẽ có những lúc bị chập chờn, cơ bản mình sẽ thiết kế hệ thống nào đó, gần như là trải nghiệm người dùng tại thời điểm đó đơn giản là mình xem sản phẩm gì đó rất hot, người dùng họ vào cái đó và họ mua cái đó thôi, trải nghiệm rất là đơn giản, click được sản phẩm họ chuẩn bị sẵn từ trước đó rồi, họ mua, họ bấm nút và họ thanh toán, mình chỉ làm sao có flow đó nó smoothly thôi, chứ người dùng họ không vào để làm chuyện khác, nói chung huy động hệ thống hơi lớn để đáp ứng phép flow đó. Cá nhân mình thấy các công ty thương mại điện tử, hoặc bất kỳ công ty nào cũng không thể fail trong tình huống đó được.
Từ lúc tốt nghiệp thì anh xác định theo con đường Solution Architect luôn hay anh thử sức với nhiều vị trí khác nhau và cuối cùng chọn con đường này?
Mình cũng chưa từng nghĩ mình làm ra là trở thành Solution Architect. Tới bây giờ mình mới hiểu được là rất khó để một bạn developer nào tốt nghiệp ra trường lại lựa chọn con đường đó, cái đó giống như là khi mình thành công mình quay lại mình tô vẽ career path thì hợp lý hơn. Bất cứ ai cũng đều muốn việc mình thành công, nên đơn giản là một người sinh viên ra trường việc họ muốn là thành công, cái sự thành công đó tùy theo giai đoạn.
Ví dụ như mình đi làm cũng hơn 10 năm, mỗi lúc nghĩ về sự thành công nó đều khác nhau. Thời còn trẻ mới ra trường, thành công của mình là title gì đó nghe nó kiêu kiêu, như là leader chẳng hạn để mình kiếm được nhiều tiền, sau này rồi thì thấy sự thành công khác đi. Tạm thời mình đủ ăn đủ mặc rồi, nên bây giờ mình mong muốn làm sao để đóng góp giá trị bản thân mình cho công ty, cho cộng đồng.
Tại sao Sendo lại lựa chọn mình trở thành Solution Architect, hoặc trước kia ở các công ty là người design các hệ thống, bởi vì trước đây mình là người xây dựng các hạ tầng, ví dụ mình làm ra cái đó mình sẽ chịu trách nhiệm đến cùng với nó. Không thể lúc nào mình desgin từ ban đầu cũng đúng, nhưng khi có cái gì sai thì mình là người có trách nhiệm đi khắc phục, khi đó mình được tin tưởng từ người mentor của mình, người lãnh đạo của mình, họ cho mình cơ hội để mình thực hành chuyện đó.
Anh hãy chia sẻ vấn đề làm một leader có tâm là như thế nào?
Như thế nào là leader có tâm, thì mình tin vào một người, khi mình gặp bế tắc, người đó sẽ chỉ giúp mình, mình sai từ đâu và mình nên làm lại như thế nào cho đúng, làm bản thân mình strong lên, mình có thể đủ lông, đủ cánh, mình có thể tiếp tục cống hiến cho công ty đó tiếp hay mình có thể rời bỏ để chuyển vị trí khác, mình làm, mình phát triển được bản thân. Một người leader, mentor có tâm như một người anh có tâm, không thể để em của mình, đồng nghiệp của mình núp sau bóng mình mãi được. Đối với mình như vậy là có tâm.
Lúc đảm nhiệm vị trí Solution Architect thì anh tưởng tượng công việc đó như thế nào? Và thực tế nó có giống như anh tưởng tượng không?
Mình tốt nghiệp đại học, mình là cử nhân hay kỹ sư gì đó, đó như là certificate chuẩn do bộ cung cấp rồi. Một người đạt tiêu chuẩn như vậy hầu như đều có background về toán học, về triết học, hay cái gì đó nó giống như nhau, gần như là có nền tảng giống nhau.
Còn nói về vị trí công ty, đơn giản như senior, ở đây họ là senior nhưng ở kia chưa chắc là senior. Một vị trí như full-stack developer, thì ở chỗ khác họ define full bao gồm cả devops hay thế này thế nọ, còn ở chỗ khác thì anh biết làm web, anh biết làm back-end, front-end như vậy thì là full-stack rồi. Thì vị trí solution architect cũng vậy, cũng tùy công ty định vị về vai trò này nọ khác nhau. Đối với vị trí của solution architect mình nghe mọi người nói vị trí Architect cần có 4 định hướng hay thấy mọi người làm về chiến lược, về chiến thuật, hay làm về article hay planning.
Phần lớn các tiệm ăn thiên về các mảng phía dưới, không phải làm về chiến lược, chủ yếu làm về chiến thuật, làm về emplacement, planning. Ví dụ như khi công ty giao cho mình việc gì đó, mình nghĩ về mặt placement thì như thế nào, về mặt các kĩ thuật, chiến thuật mình làm như thế nào. Ví dụ các bài toán phải đòi hỏi thực sự về tư duy, về cách làm, chứ không phải cứ nhào vô mà làm được.
Ví dụ như bài toán về notification chẳng hạn, mảng thương mại điện tử, một user có rất nhiều device, mình không biết user xài cái nào và có hàng chục triệu user như vậy. Thì tất nhiên các nền tảng bây giờ mình nghe đơn giản là đã có, chẳng hạn như Google Drive Space này nọ nó bắn rồi, vậy mình care cái gì về nó. Giả sử mình cần thống kê về số lượng notification ai đọc và chưa đọc, mình phải lưu lại thông tin user đó với tin nhắn đã đọc hay chưa True – False, nó lên đến hàng triệu messages, nói chung con số nó khủng khiếp, và nhiều tháng thì con số nó khủng khiếp hơn nữa. Và mỗi lần bắn 1 tin marketing như vậy nó có thể hoàn toàn gây ra tắc nghẽn hay đình trệ. Câu hỏi đặt ra là mình cần có chiến thuật, cách làm để mình đảm bảo được requirement và vừa phát triển tính năng đó không bị bế tắc, nếu như mà sập hệ thống là mình bế tắc rồi. Mình có thể làm được điều đó bằng cách planning, bước 1 làm gì, bước 2 làm gì, thường thường công việc của anh hướng như vậy.
Anh có thể tóm gọn khái niệm về Solution Architect theo quan điểm của anh được không?
Mình có thể tìm hiểu các tổ chức lớn, khi define role như thế nào thì mình có thể nhìn theo đó một cách tổng quát. Nhưng trong buổi phỏng vấn mình chia sẻ về Software Architect thiên về hướng emplacement, về chiến thuật, còn ví dụ như về Technical Architect thiên về strategy cộng với emplacement, đó là các tổ chức người ta làm.
Còn khi nói chung một người làm về software, về mặt bản thân người đó cần có một số skills nhất định, cần có skill về kỹ thuật là một điều kiện kiên quyết, nhưng ngoài ra cần có hiểu biết về business nữa, người làm business đã cực khổ đi kiếm khách hàng về, nhưng người làm về kỹ thuật không hiểu biết về business lại trách móc khách hàng stupid thì hai bên sẽ khó giao tiếp với nhau. Rồi mình phải hiểu về process để cho mọi thứ hoạt động trơn tru, một tổ chức càng lớn thì process càng hoàn thiện. Cuối cùng kỹ năng gần như chúng ta cần phải học suốt đời, kỹ năng communication, xây dựng các mối quan hệ tốt đẹp, giống như là relationship.
Riêng những bạn muốn đi theo con đường Solution Architect thì anh có lời khuyên gì cho xuất phát điểm cũng như lộ trình học tập của mấy bạn không?
Rất khó để mà mình khuyên một bạn nào đó ra trường đi theo con đường Solution Architect, làm thế nào để mình thuyết phục được người khác là tui giỏi lắm rồi, bây giờ tui sẽ đảm nhận vị trí solution architect ở công ty của mình, tui làm vị trí này, tui sẽ đem về benefit thật là lớn cho anh? Công ty mình có tổ chức, có những người đã từng đóng góp có người đồng hành của mình rồi, nên là mình không thể nào thấy một người này mà bỏ người kia, nó có rất nhiều yếu tố khiến cho người lãnh đạo – người đồng ý nhận mình làm vị trí solution architect – họ phải cân nhắc, mình phải thỏa các điều kiện không chỉ bản thân mình thôi là mình sẽ làm được.
Nhưng, một bạn developer làm thế nào trong quá trình từng giai đoạn mình phát triển bản thân thì mình phát triển đúng với giai đoạn của mình. Ví dụ như mình mới ra trường, một trong những điều mình thiếu là skill về technical, tại vì ở trường người ta dạy tổng quát mình cũng phải hoàn thiện các skill còn lại, về mặt ngôn ngữ, hệ thống, chiến thuật, database và tất cả những gì mà mình chưa biết, sau đó mình tiếp tục hoàn thiện các skill về business. Và tất nhiên đầu tiên mình là người mới ra trường, chẳng ai đi trao đổi business với mình cả, đi ra ngoài bô bô về business thì thấy hơi trẻ con một chút; rồi nói về quy trình, những người làm về quy trình phải có kinh nghiệm mới làm về quy trình được, chứ mình còn trẻ mà vào làm quy trình thì sẽ bị xáo trộn mọi thứ, rồi sau này mình lớn, mình trở thành senior rồi thì tất nhiên mình mới nói về xây dựng mối quan hệ tốt đẹp, ý là lúc mình còn trẻ mình cũng có nhưng đó là với bạn bè, đồng nghiệp thôi, còn xây dựng mối quan hệ mà mình muốn đề cập để lúc nào mình làm việc cũng smoothly. Mình nghĩ mọi người cứ đi theo từng giai đoạn, từng nấc của cuộc đời như vậy, đến một lúc nào đó trở thành Solution Architect vị trí manager, hoặc có thể mình chọn trở thành vị trí lập trình viên bình thường thôi, cũng là sự lựa chọn của bản thân mình, happy với sự lựa chọn đó.
Ví dụ như mình làm Solution Architect, và lúc nào mình cũng phải đi tranh luận, thuyết phục người khác, rất tốn năng lượng và mất rất nhiều thời gian, mình nghĩ chuyện này chuyện kia, không có thời gian chăm sóc gia đình con cái, còn khi mình là lập trình viên, mình lên mình nhận đúng task và mình làm và tất nhiên mình cũng tạo ra mọi thứ tốt đẹp trên thế giới này thôi và rồi mình về mình ăn ngon ngủ yên, đó là sự lựa chọn của cuộc đời.
Tại sao anh chuyển sang làm về E-commerce? Có phải do tiềm năng nào đó hay có thách thức mà anh muốn khám phá không?
Bản thân mình mọi thứ đến với mình một cách tự nhiên. Ở những công ty lớn họ có rất nhiều điều hay để mình học hỏi, giống như mình nghĩ ở một công ty nhỏ tất nhiên nó đã có một đầu vấn đề rồi mình làm mình cũng biết, nhưng khi ở công ty to nó càng có nhiều vấn đề nữa và làm thế nào để học vận hành bộ máy to như vậy thì đó là một cái thách thức, nếu như mình nhìn vào và nghiên cứu kỹ phần đó sẽ thấy được cách họ giải quyết rất là hay.
Gameloft là một công ty rất to, vận hành có lớp lang, những người mới vào được training một cách bài bản, công việc thì có công cụ để mà khi giao đến từng người thì rõ ràng, mạch lạc; một công ty có giàn hậu thuận đằng sau rất lớn những người giỏi về mặt kỹ thuật, do vậy khi mình ở đó mình được học rất là nhiều. Bài học đầu tiên ở Gameloft mà mình học được đó là các mình em đồng nghiệp rất là máu lửa, tầm nhìn rất xa, thời điểm đó mình ra trường, mình không hiểu vì sao họ lại có được như vậy, và nó giúp mình đặt ra được khát vọng để mình được giống như họ. Lần thứ 2 là mình hiểu được áp lực của người làm business là như thế nào, mình mới thấy thông cảm cho vị trí quản lý của mình, họ chịu rất nhiều áp lực, đó là bài học đầu tiên khi mình làm ở Gameloft mình nhận được.
Sau đó mình làm về công ty outsourcing, cũng làm về product, nhưng mà trong công ty có phát triển sản phẩm chuyên đi thu thập dữ liệu và tách ra thành công ty gọi là Unit Media, để làm về thu thập và phân tích dữ liệu, ở đó cũng có nhiều bài học, là nơi mình trưởng thành thật sự về mặt kỹ thuật. Requirement của sản phẩm đó, nghe thì đơn giản nhưng mà nó phức tạp thế này, mình phải thu thập dữ liệu làm sao nhanh nhất, những nội dung mà người VN mình trao đổi bằng tiếng Việt có ở tất cả các kênh truyền thông phải thu thập về sau nhanh nhất để khách hàng của mình để họ biết được khách hàng của mình đang complain chuyện gì đó trong thời gian rất ngắn để mà đội xử lý truyền thông can thiệp kịp thời, đánh giá tình hình, xem xét và xem cách giải quyết như thế nào.
Giai đoạn sau mình làm ở Sendo, là công ty to và phát triển nhanh, vì vậy đòi hỏi mình phải thiết kế hệ thống thích nghi được sự phát triển nhanh như vậy, với lượng người dùng, lượng traffic lớn, mình cũng phải thiết kế hệ thống làm sao đáp ứng được những chuyện đó. Về thương mại điện tử thì các công ty đều quan tâm yếu tố security, thì mình cũng phải tìm hiểu những chuyện như vậy.
Quay lại câu hỏi “cơ duyên nào chuyển qua thương mại điện tử”, thực ra mình nghĩ đó chuyện cũng giống bao người. Khi mình cũng trưởng thành và cần tìm một môi trường khác thử thách hơn, người anh hiểu năng lực của mình và giới thiệu mình sang một nơi khác phù hợp và mình tiếp tục qua đó đón nhận những thử thách mới, là lúc mình qua làm e-commerce, mình thấy đó là quyết định đúng đắn.
Công nghệ nào đáng sử dụng cũng như ưu/nhược điểm của công nghệ đó?
Đối với suy nghĩ của mình 1 bạn lập trình viên thì nên học ít nhất là 2 ngôn ngữ và nên giỏi ít nhất là 2 ngôn ngữ. Thí dụ như mình có thể giỏi về Golang cả PHP, hay PhP và NodeJS chẳng hạn, rồi về mặt Database, mình nên giỏi cả dựng như cơ sở dữ liệu quan hệ như MySQL, và các cơ sở dữ liệu không mối quan hệ như MongoDB mình còn gọi là NoSQL á. Về mặt framework mình cũng nên biết ít nhất là 2, mình nghĩ như vậy là bởi vì nó giúp cho mình có 1 cái nhìn rộng mở hơn 1 vấn đề, vì lúc nào mình cũng nghĩ về 1 thứ nên mình tự bóp hẹp bản thân mình và nhìn ngắm bản thân mình trong 1 cái gì đó, khi mình nhìn rộng ra 2 hướng, thì nó sẽ có tính tương hỗ và tương thích với nhau thí dụ cái kia nó làm cái này, cái kia nó làm cái khác, 2 cái đó không thể nào giống nhau được, do đó là mình mới hiểu được những người Creator của ngôn ngữ đó họ suy nghĩ gì, họ có cái triết lý gì, họ có cái quan điểm gì trong bản thân họ. Và đó là cái điều mà khi mình biết những chuyện đó, giống như là mình học hỏi được từ những người đi trước, từ những bộ não siêu việt, là những người thiết kế ra ngôn ngữ, cái framework là họ có cái tư duy về hệ thống rất là tốt, tư duy về tổ chức này nọ, và đó là cái khiến cho mình trở nên gọi là mình hiểu biết rộng ra, không chỉ sâu mà rộng.
Anh có thể chia sẻ về những lỗi nào mà một người nhiều kinh nghiệm như anh vẫn có thể gặp phải và điều đó làm anh thay đổi như thế nào?
Một trong những mistake mình hay gặp phải, thí dụ như mình đo lường vấn đề nó dưới mức mà vấn đề đó thực sự có thể đối mặt. Bởi vì mình có thể do chủ quan dựa trên kinh nghiệm của mình, cái thứ 2 là mình không nhận đủ các nguồn thông tin, không phải người khác giấu mình cái gì mà do trong quá trình trao đổi và nói chuyện với nhau mình có thể dễ dàng bị miss những cái thông tin như vậy, dẫn đến mình estimate cái gì thì mình hay under cái mức đó, thí dụ như các bạn lập trình viên bình thường, thì thường over các task được giao, vì khi manager họ nghĩ được rồi, họ chia cái task cho nó nhỏ nhất đến mọi người, nhưng ông manager lại có cái lỗi hay estimate 1 vấn đề dưới ngưỡng cái mức đó, dẫn đến nhiều dự án thất bại như vậy. Đó là những lời thay cho manager thường gặp, còn đối với người làm kỹ thuật thông thường như mình, những lỗi hay gặp là mình bị thiếu cái kỹ năng, ví dụ mình không đánh giá hết hậu quả về vấn đề liên quan tới tài chính network, security, mình không đánh giá được tại 1 thời điểm nào đó, cái mạng với cái băng thông của mình nó sẽ có vấn đề, rồi mình cũng không biết trong cái tổ chức của mình nó có những cái lỗ hổng gì về bảo mật, hay lỗi gì mà nó có thể xảy ra, tại vì những lỗ hổng về cái security không hẳn về yếu tố kỹ thuật phải tốt mà nó còn về yếu tố con người, vận hành về hệ thống, nó rất là khó để cho mình có cái nhìn nào mà hoàn thiện về nó hay ngăn ngừa được những chuyện như vậy, nên nó sẽ vẫn diễn ra.
Việc xây dựng hệ thống thương mại điện tử ở Việt Nam có khác gì so với thế giới?
Mình cũng không thực sự làm những công ty nào mà gọi là tầm cỡ thế giới như là Alibaba, Amazon để mà nói về những vấn đề hay thách thức mà thực sự họ phải đối mặt để giải quyết là gì. Nhưng thực sự làm ở công ty và môi trường Việt Nam trong business về thương mại điện tử thì mình biết là những vấn đề đó nó diễn ra hàng ngày và không dễ giải quyết. Nếu như mình có solution giải quyết và dĩ nhiên không diễn ra nữa, thậm chí là người ta sẽ bán solution đó cho mọi người luôn, và ai cũng có solution là thành công rồi. Thật ra để mà giải quyết những vấn đề đó, nó cần 1 thời gian dài, từ cái việc là xã hội mình thay đổi hành vi, được training lại hành vi, giống như những người trẻ của mình thì mình không rảnh đâu mà đi dìm hàng người khác làm niềm vui cả, cái chuyện đó nghe nó xảy ra như vậy là do hiệu ứng lan truyền của mạng xã hội thôi chứ nó không hẳn là cái chuyện nghiêm trọng, phần lớn cái chuyện mà mình cần lo lắng ở đây là giữa các đối thủ, họ chơi xấu lẫn nhau, bây giờ em bán quần áo, bạn kia bán quần áo giống em thì họ sẽ tìm cách phá em, và người dùng sẽ suy xét chuyện đó, cái nguy hiểm nhất là những người khác họ phá 1 ai đó với mục đích tối tăm với cái ý đồ nào đó không tốt, nếu họ phá vì niềm vui thì hôm sau gặp chuyện khác vui họ sẽ không làm điều đó nữa, thì cái chuyện đó đáng lo ngại, thì cái việc đó, nó không chỉ xử lý về mặt kỹ thuật mà cả những cái xử lý về mặt quy định vận hành. Ngoài ra nó cũng có cái yếu tố là những khách hàng thương mại điện tử họ chạy event thì họ sẽ gom ra lượng lợi ích rất là lớn, thí dụ họ bán iPhone với giá rất là thấp, thì lúc đó sẽ có những đội rất là chuyên nghiệp họ săn hàng thưởng như vậy, thì họ sẽ dùng post, hoặc cái thủ thuật nào đó để mà họ lấy những cái lợi ích đó, về cho bản thân họ, thì thực sự cái vấn đề này về mặt yếu tố kỹ thuật là giải quyết được, dựa trên những fact về 2P, dựa trên hành vi họ, để mà ngăn ngừa những chuyện đó diễn ra, để đưa họ vào cái thang đợi, chậm hơn những người bình thường, để mà nó công bằng với tất cả mọi người.
Theo anh tiềm năng của việc ứng dụng AI trong việc detect những fraud trong lĩnh vực E-Commerce có khả thi không? Hay sẽ có những khó khăn thách thức gì? (về nhân lực, cấu trúc, hệ thống, quy trình…)
Thật ra mấy vấn đề về AI, trước đó mình cũng làm về big data cũng vậy, thách thức nhất của AI là làm sao tăng độ chính xác vấn đề mình làm nên, tại vì nó không phải là con người, thì đòi hỏi máy phải có độ chính xác lớn, nếu nó không lớn như kỳ vọng thì sẽ xảy ra chuyện gì, tức là người ta sẽ nghi ngờ là cái tầng giá trị đó vẫn có những cái chính xác và những cái sai sót, thí dụ mình đánh giá cái người đó là gian lận, nhưng thực ra không phải là gian lận, những người không gian lận nhưng bị đánh nhầm là gian lận, vì vậy nó sẽ có rất là nhiều phản hồi tiêu cực từ phía khách hàng về.
Quay lại với Solution Architect, theo anh đâu là 3 tiêu chí tiên quyết cần có đối với vị trí này?
Mình cũng muốn nói ý này là không chỉ ở vị trí kiên quyết, mình xin nhắc lại không phải kiên quyết của vị trí solution architect mà đối với 1 bạn lập trình viên, thì cái đầu tiên quan trọng và kiên quyết nhất là kỹ thuật xây dựng thì các kỹ năng về mặt kỹ thuật phải được xây dựng dựa trên yếu tố phần lớn là phải tự học, không ai hơi đâu mà chỉ, hay ngồi dạy cho mình, còn người khác dạy hay chia sẻ với mình là bởi vì cả 2 cùng nhận ra được điều còn thiếu của người này, mình học hỏi được người này, mình học hỏi từ người kia, cho nên bản thân mình phải là người biết tự học để mình chia sẻ kiến thức với người khác và nhận được từ người còn lại, thì cái kỹ năng tự học đối với mình là cực kỳ quan trọng, coi lại những điều mà cần trước để mấy bạn phát triển bản thân lên, để trở thành 1 lập trình viên giỏi, đối với 1 senior hay 1 người chuyên về làm architect, đầu tiên là kỹ năng tự học, mục tiêu của nó chính là không phải cái gì mình cũng sẽ được biết hết ở trường, hay là tất cả mọi thứ mình sẽ nhận được từ người khác, mà những kiến thức đó nó nằm trên mạng, trong các framework, hay trong các opensource, hay trong những bài viết, bài chia sẻ, có rất nhiều kênh, hay những kênh giáo dục này nọ, mình phải học nó thì mình tiếp cận với những người đồng nghiệp anh em của mình, mình chia sẻ lại đó và nhận lại những cái chia sẻ ngược lại từ những mảng kiến thức khác người khác dành cho mình, thì mình improve bản thân. Thì nói về tự học, 1 trong những cái đặc điểm mình cho rằng là khả năng ghi chép tất cả những thứ đã được học, dùng đầu óc của mình để nhớ và tự trong 1 môi trường công việc nó áp lực và chịu nhiều căng thẳng, tức là đôi khi mình sẽ quên mất hôm trước mình làm cái gì rồi, do đó mình phải ghi chép lại tất cả mọi thứ được học, mình phát triển kỹ năng, việc block lại tất cả thông tin mình học được, những cái lỗi mà mình đã gặp phải để mà review lại bản thân, hay là mình sẽ đem nó chia sẻ lại cho các bạn junior, những người mà mình sẽ thành trainer trực tiếp cho các bạn đó. Cái thứ 2 là kỹ năng thấu hiểu, thấu hiểu về công việc của người khác, tại vì mình phải thấu hiểu cho bộ phận làm business, như khi mình làm về công ty outsourcing theo kiểu là tìm kiếm và dành lấy từ khách hàng để công việc nó rất là khó rồi mình cũng thấu hiểu cho đồng nghiệp của mình, họ cũng gặp những cái khó khăn trong cái công việc nhất định, tức là mình đi làm mình không thể nào chờ mistake của người khác để mình tấn công họ, mình phải nhìn ra, thông cảm, ông làm wrongmain sẽ thông cảm cho ông làm HM, và ngược lại, thì cái chuyện đó nó giúp mình xích lại gần, hiểu họ.
Theo em thấy việc xây dựng 1 đội dev làm việc hiệu quả rất là quan trọng và cần nhiều yếu tố khác nhau. Anh có thể chia sẻ tips hoặc lời khuyên nào không? Và anh có sử dụng các hình thức như pair programming, cross-training,… hay tạo điều kiện cho các juniors thử sức hay không?
Như em nói mong muốn trở thành người đồng nghiệp tốt của người khác là mong muốn của mình, suy nghĩ của mình đơn giản lắm, mình không muốn ai đi theo sau cái bóng của mình, mình mong muốn tất cả mọi người đều đi song hành cùng mình, tiến lên phía trước cùng mình, vì vậy mà kỹ thuật hay những điều mà mình có thể giúp cho đồng nghiệp của mình bằng cách trực tiếp hay là những cái âm thầm lặng lẽ, mình đều cố gắng làm cả, những cái chiến thực cần có giống như làm pairwork theo nghi thức, đó là phương pháp phát triển phần mềm của công ty, công ty nó có nhu cầu thì mình làm thôi, không vấn đề gì, nhưng tất cả tình cảm, suy nghĩ của mình, mình phải có cái suy nghĩ luôn luôn thúc đẩy các anh em đi lên phía trước, tức là nếu mà có những cái thử thách, hay tìm hiểu những cái điều gì hay mình cũng suy nghĩ làm thế nào để làm cho mọi người thích cái đó, muốn tìm hiểu cái đó, và muốn làm được cái đó, thì cá nhân mình, mình luôn muốn như vậy, thì với những cái suy nghĩ như vậy, cho nên là mình sợ cái người mà minh chia sẻ tất cả mọi thứ, biết tất cả mọi người, giúp cho mọi người hiểu rõ vấn đề, thì khi hiểu rõ mọi người sẽ hiểu là mình có muốn làm chuyện đó hay không, và hiểu rõ thì nhiều khi sẽ thấy thú vị và thấy thú vị thì mọi người sẽ muốn làm, còn mình hay dở trong cái việc mà trở thành 1 người manager tốt giống như là quan tâm chuyện tâm tư tình cảm, gia đình, tình yêu, hay họ ở những cái khía cạnh khác, thì mình không phải là người giỏi trong lĩnh vực đó, như những cái chuyện như là nhiều khi chuyện tình cảm với nhau mình cũng hơi bối rối, mình phải feedback lại hay là mình phải trả lời câu đó như thế nào, nếu câu trả lời của mình hời hợt thì mình nghĩ lại người khác sẽ buồn, mà cái câu hỏi là mình nghĩ để trả lời cho chính xác thì mình phải đào sâu vào trong mối quan hệ đó, thì mình không có thiên hướng như vậy.
Làm thế nào để một bạn xác định được là mình nên đi theo con đường Solution Architect? Anh có lời khuyên nào dành cho các bạn đang muốn hướng tới công việc này không?
Nếu thực sự có quyết tâm để trở thành người top talent về mặt SQL thì giống như mình đã từng xem 1 cái video của TopDev của anh Tùng Nguyễn, trước là làm head về engineering Tiki, sau đó khoảng 1 thời gian mình cũng có buổi ngồi nói chuyện với anh ấy trong quán cà phê. Giống với những gì anh ấy chia sẻ, nói chung để trở thành top talent về mảng SQL, thì có nghĩa là mình viết code giỏi, một cách bài bản, mình phải kiểm chứng và test những phần mềm như QC thực thụ, mình có thể deploy vừa delivery sản phẩm của mình như 1 DevOps 1 cách hoàn chỉnh, thì mình có thể tâm đắc với các chia sẻ của anh Tùng, cách thứ 2 là nhìn vào tính cách của những người như anh Tùng Nguyễn, là người điềm tĩnh, 1 người cẩn trọng, 1 người thông minh nhưng mà khiêm nhường, tại vì mình phải xác định được những điều mình làm, và tất cả những việc làm đó mình sẽ phải học hỏi, thì phải có ai đó, đồng nghiệp chia sẻ mình, giúp đỡ mình, thì với những cái tính cách, công việc thành công như vậy mình có thể tham khảo, học hỏi, nhìn vào đó để đối chiếu với bản thân mình, thì với tính cách của anh Tùng, rất là dễ chia sẻ với người khác, dễ dàng nhận sự hỗ trợ khác, có thể cùng tìm hiểu vấn đề đó chưa đúng, hoàn thiện nó, thì anh nghĩ đó là hình mẫu mà 1 người thành công muốn tham khảo.
Trong team anh có vị trí full-stack developer không? Theo quan điểm của mình, anh có nhận xét gì về vị trí và vai trò của full-stack developer?
Vị trí fullstack developer trong giai đoạn quá trình lịch sử của nước mình nó chia nhiều giai đoạn. Giai đoạn đầu tiên là giống như mình là 1 vương quốc, đế chế như vậy, thì 1 ông vừa biết làm PHP backend có thể làm các HTML frontend thì trở thành fullstack, nên biết làm jQuery, hay Angular này nọ thì trở thành fullstack. Sau này thì những ông biết làm fullstack, thì đòi hỏi cao hơn 1 chút, như biết 1 chút về backend như PHP, biết 1 chút về Frontend, viết app mobile chẳng hạn thì trở thành fullstack. Rồi thậm chí là biết làm về Database nữa, thì gom tất cả những cái đó thì thành fullstack. Ngày nay fullstack là 1 người có đầy đủ tất cả kỹ năng develop về mặt testing, về mặt operate giống như là DevOps, thì những người đầy đủ tất cả các kỹ năng trở thành fullstack, nhưng mà cho đến thời điểm hiện tại của năm 2020, thì chúng ta sẽ thấy, khái niệm nó bị tác động bởi những cái tổ chức lớn như là Google, Amazon thì phải thêm 1 cái yếu tố mà người developer phải biết nữa đó là security thì tất cả những chuyện đó, trở thành fullstack. Tại sao có sự phát triển đó, thì bởi vì đơn giản, kiến thức nó có sự kế thừa, thí dụ như đất nước mình, mảng công nghệ thông tin cách đây 10 năm chỉ là PHP. Bây giờ mình đã tham gia vô sâu hơn trong cái gọi là cái dây chuyền sản xuất, hay cái dây chuyền công nghệ thông tin của thế giới, mình cũng dần dần tiếp cận và được nhận về những cái project, dự án đó, mình cũng có thể có những công ty được xem là kỳ ân, do đó là mình cũng phải áp dụng mấy cái tư tưởng cao như vậy, để mà duy trì và tiếp tục phát triển, do đó là những cái nền tảng đó, đã được đưa về nước mình và được áp dụng, và nhiều cái đã áp dụng thành công. Bây giờ cái khái niệm đó, nước mình cũng đạt được những cái mức độ cạnh tranh như vậy.
Rất cảm ơn anh Phú đã chia sẻ rất tận tình về quá trình làm việc cũng như các kinh nghiệm, bài học anh tự rút ra. TopDev chúc anh và Sendo ngày càng phát triển và thành công hơn nữa, xóa bỏ khoảng cách giữa công nghệ Việt Nam và thế giới, bắt kịp những tiến bộ mới nhất của công nghệ, cũng hy vọng các bạn độc giả có định hướng về Solution Architect hay các bạn developer hiểu rõ hơn cách phát triển bản thân và định hướng nghề nghiệp của chính mình.
Cụm từ “Product Manager” không còn là thuật ngữ xa lạ với cộng đồng IT – Lập trình trong những năm gần đây. Đối với nhiều bạn đã trong ngành một thời gian đang muốn thăng tiến nghề nghiệp, thì giấc mơ Product Manager là vô cùng có sức hấp dẫn. Tại Việt Nam hiện không ít các sự kiện về Product Manager, các buổi sharing cũng như định hướng nghề cho một Product Manager. Vị trí là cánh cửa đối với gần như mọi background ngành nghề: Bạn có thể đi từ lập trình, thiết kế, hoặc mới tốt nghiệp ngành kinh doanh, phân tích viên tại công ty,… Gần như không có giới hạn.
Tuy nhiên, bề nổi có sang có hay đấy, nhưng để đến được đấy thì còn nhiều thứ cần làm rõ – hiểu sâu & mài dũa thì mới bước tiếp được. Bài viết bên dưới sẽ “vẽ” ra chi tiết hơn về “bức tranh” Product Manager cho những ai đang đuổi mây và những gì họ cần chuẩn bị nếu như đang hướng đến vị trí này.
Hiểu về Product Manager là gì?
Nói về Product Manager (Người quản lý sản phẩm) không dễ để có được một định nghĩa chính xác và đầy đủ nhất, bởi mỗi công ty có một kiểu định nghĩa khác nhau. Trên thực tế, Product Manager chính là người quản lý sản phẩm, chịu trách nhiệm chính, dẫn dắt và liên kết các bộ phận với nhau để cùng thực hiện mục tiêu nhất định. Nói một cách chính xác hơn thì PM chính là cầu nối giữa UX, Technology và Business.
Business – Ưu tiên trên hết của việc quản lý sản phẩm là business: tập trung vào tối đa hóa giá trị kinh doanh từ sản phẩm.
Technology – Xác định được cái mình muốn build phải đi kèm với câu hỏi “Build bằng cái gì?”. Điều này không có nghĩa PM phải ngồi xuống “cà phím” viết code, nhưng phải hiểu được các công nghệ cần có, và quan trọng nhất là việc hiểu được những gì cần thiết để đưa ra quyết định đúng đắn.
UX (Trải nghiệm người dùng) – Product Manager phải vừa là tiếng nói của doanh nghiệp, vừa phải quan tâm và đầu tư vào trải nghiệm người dùng.
Product Manager cần phải cân bằng nó và đưa ra những quyết định và đánh đổi quan trọng cần thiết. Từ đó dẫn đến một quy trình chiến lược để quản lý và phát triển sản phẩm hợp lý.Trên thực tế, điều này đồng nghĩa với việc thúc quản nhiều việc nhỏ cùng một lúc: quản lý tồn đọng sản phẩm, duy trì product roadmap, nói chuyện với cổ đông, nói chuyện với khách hàng và điều phối hoạt động của nhóm để đảm bảo tất cả các bạn đều làm việc theo cùng một mục tiêu.
Đây không phải là một nhiệm vụ đơn giản – nó liên quan đến rất nhiều người. Trên thực tế, phẩm chất quan trọng nhất mà người quản lý sản phẩm mang đến là khả năng làm việc với mọi người. Điều quan trọng là bạn giỏi đến mức nào để khiến mọi người từ các khu vực khác nhau của công ty, với các chương trình nghị sự và động lực khác nhau, đoàn kết đằng sau tầm nhìn của bạn.
Product Management – Quản lý sản phẩm, là quá trình quyết định xây dựng Cái gì và Bằng cách nào xây dựng nó. Có thể nói trắng ra là “xác định chiến lược và trải nghiệm sản phẩm”. Là một Product Manager, bạn sẽ có cái tên khác dưới cương vị “CEO của sản phẩm”.
Quy trình Product Management sẽ có “bức tranh chung” như sau:
Nghiên cứu thị trường và nội bộ: Nghiên cứu để đạt được chuyên môn về thị trường chung của công ty, từ người dùng và từ đối thủ. Hiểu rõ sản phẩm và thị trường là điều quan trọng đầu tiên, nhất định bạn phải hiểu rõ từng chi tiết sản phẩm của mình hơn bất kỳ ai.
Tuy nhiên, chỉ dừng ở mức hiểu sản phẩm thôi vẫn chưa đủ mà bên cạnh đó bạn còn phải hiểu thị trường tiềm năng, nắm bắt được tâm lý khách hàng hiện tại và cả nhóm khách hàng mà bạn muốn hướng đến. Chưa kể là present thuyết trình với nội bộ công ty, nhà đầu tư và các stakeholder để chính thức bắt tay vào kế hoạch.
Phát triển chiến lược: Từ thông tin dữ liệu ngành đã có được, phát triển nên một kế hoạch chiến lược cho sản phẩm – bao gồm cả mục tiêu và mục đích, một sơ đồ tổng quan cho sản phẩm trên một timeline chi tiết. Tại đây cần phải có khả năng định hướng những bước đi kế tiếp, những mục tiêu mà sản phẩm sắp hướng đến. Và quan trọng hơn là phải nắm bắt sản phẩm của đối thủ.
Kế hoạch về Product: Phát triển kế hoạch cho sản phẩm theo dạng Product Roadmap features (roadmap về các tính năng). Ngoài ra thống nhất về UX bằng wireframe và các mockups Designs cũng cần phải thống nhất thông qua tại đây.
Lên UX và Design: Một sản phẩm muốn tồn tại lâu trên thị trường thì phải có một UI cực kì đơn giản và dễ dùng, UX thì ấn tượng trơn tru. Thử đặt vấn đề, nếu một ứng dụng nào đó ra mắt nhưng UI lại quá phức tạp, UX không mượt mà thì bảo đảm người tiêu dùng sẽ “một đi không trở lại”.
Đến hiện tại, khi công nghệ 4.0 đang “làm mưa làm gió” thì tầm quan trọng của UI/UX lại càng được nâng lên. Chính vì vậy, là một PM nhất định bạn phải đảm bảo UI/UX thật hoàn hảo.
Phối hợp phát triển build sản phẩm: Sau khi kế hoạch và các đầu hạng mục đã được “bật đèn xanh”, bây giờ sẽ tiến hànhphối hợp với các bộ phận có liên quan để code nên sản phẩm cuối và chuẩn bị cho testing và launching ra thị trường.
Thu thập feedback và phân tích dữ liệu: Sau một loạt building, testing, và cho sản phẩm ra mắt thị trường, hãy tiếp tục thu thập và học dữ liệu người dùng – hãy thẩm thấu feedback trực tiếp của users, cái gì tốt – cái gì chưa tốt, cái nào chạy – cái nào không chạy và cần bổ sung cái gì.
Từ đây sẽ quay lại khâu “Product” và làm việc trực tiếp với các bộ phận liên quan để cải thiện chúng cho những lần sau.
Có một sự thật trớ trêu thay, đó là hiện nay rất nhiều Product Manager không thực hiện đủ Product Management. Rất nhiều PM chỉ bị cuốn vào những phần việc quá nhỏ nhặt. Thực tế nó không sai, nhưng nó cũng không đủ. Một số công ty còn thiếu những điều cơ bản, ví dụ: khung quản lý sản phẩm, duy trì lộ trình sản phẩm, viết yêu cầu của khách hàng, hiểu lợi thế cạnh tranh làm các nghiên cứu về độ khả thi. Thực tế cho thấy cụm từ Product Management tại mỗi công ty và ngữ cảnh sẽ có ý nghĩa khác nhau.
Làm Product Management tại một công ty startup cần có tư duy khởi nghiệp mạnh mẽ và không ngừng chạy thử nghiệm. Họ tập trung vào vấn đề mà startup của họ đã đặt ra để giải quyết. Họ có thể thay đổi bất cứ điều gì và bất cứ thứ gì nhanh chóng.
Mặt khác, tại một công ty lớn, thì quy trình sẽ tập trung vào tối ưu hóa, lặp lại và quản lý phối hợp chi tiết giữa tất cả các team cross-functional phức tạp. Tại các công ty lớn, bản thân sản phẩm có thể đã gần như được xác định. Nhiệm vụ chính của Product management là giải quyết các chi tiết, cân đối sản phẩm phù hợp với công ty và phân phối.
Mặt dù Project Management sẽ đều có 1 khung quy trình chuẩn để follow, tuy nhiên vai trò thực tế của một PM có thể khác nhau nhiều giữa các công ty lớn và nhỏ. Chính vì thế hãy dựa trên ngữ cảnh hiện tại của bạn để đánh giá xem bước tiếp theo của bạn là gì.
Công việc của Product Manager = Product Management?
Đây phần mà bàn dân thiên hạ hay hiểu sai nhất về vị trí Product Manager.
“Ông làm quản lý sản phẩm là ông quản lý cái sản phẩm phải không?”
Đúng, mà cũng không đúng! Trong Job Description của Product Manager thì Product Management chỉ là một function – một trọng trách trong nhiều workload khác của một Product Manager mà thôi.
Đặt mình ở vị trí của người dùng
Có nghĩa là, PM sẽ phải là người thấu hiểu được khách hàng của mình mong muốn điều gì để từ đó nói lên những vấn đề mà họ gặp phải để khắc phục nhanh chóng. Ví dụ: Một người dùng đang khó khăn và bất tiện về việc mỗi lần login là phải nhập lại pass. Công việc của PM lúc này là biết được vấn đề này từ sớm và tác động đến team để cải thiện tính năng này thành lưu mật khẩu tự động.
Chú trọng về trải nghiệm người dùng cuối
Là PM trong lĩnh vực technology thì bạn đã hiểu tầm quan trọng của một UI/UX “ngon”. Một sản phẩm muốn tồn tại lâu trên thị trường thì phải có một UI đơn giản và dễ sử dụng. UX cũng phải được đảm bảo. Nếu bản thân dùng một ứng dụng nào nhưng UI lại quá phức tạp và UX không mượt mà thì bảo đảm – không cần đến người tiêu dùng – chính bạn sẽ “dứt áo ra đi” trước. Trong thời buổi công nghệ 4.0 đang “làm mưa làm gió” thì tầm quan trọng của UI/UX lại càng được nâng lên. Chính vì vậy, là một PM nhất định bạn phải đảm bảo UI/UX thật hoàn hảo.
Sản phẩm “thật”
Khi trở thành một Product Manager, bất cứ những tính năng mà bạn mang đến cho người dùng đều phải có căn cứ và những số liệu cụ thể. Bạn phải thấy được rằng nó thực sự cần thiết và người dùng mong muốn được trải nghiệm. Theo lý thuyết, tính năng ấy rất hữu dụng, thế nhưng trớ trêu rằng người dùng lại không sử dụng. Vậy bài toán đặt ra là bạn phải làm sao cho tính năng ấy “ nổi bật” bằng cách thay đổi thiết kế. Cuối cùng, bạn thu thập dữ liệu và đi đến kết luận. Đừng bao giờ đoán mò mà phải thực thi nó.
“Đoàn kết là power” – Hợp tác cùng đồng đội
Một PM còn phải lo về việc giao tiếp – truyền đạt các mục tiêu và kế hoạch sản phẩm cho phần còn lại của công ty. Họ phải đảm bảo tất cả mọi người đang làm việc hướng tới một mục tiêu tổ chức chung.
Trách nhiệm là cầu nối nên PM ngoài việc hợp tác với khách hàng thì PM cần phải chủ động hỗ trợ và hợp tác với các bộ phận Sales, Marketing, IT. Bên cạnh đó, bạn cũng phải cộng sự với các Project Managers, Business Analysts và Developers.
Điều này cực kỳ quan trọng bởi họ là người dựng nên sản phẩm của bạn, và nhiệm vụ của bạn là làm sao để họ cũng thấu hiểu sản phẩm giống như bạn. Một Product Manager giỏi luôn có một tầm nhìn tốt cho sản phẩm và biết cách “chèo lái” làm sao để sản phẩm đi đúng theo mục tiêu.
Nhạy cảm với sự thay đổi và chịu bứt phá
Nếu bạn là một Product Manager thì nhạy cảm với sự thay đổi là một tố chất nên có. Khi mà thời đại công nghệ vượt trội đang phát triển, hàng ngày hàng giờ thậm chí là mỗi phút mỗi giây lại có những phát minh mới ra đời, nếu bạn không chấp nhận thay đổi mình thì chắc chắn sản phẩm của bạn sẽ “lạc hậu”, mà gay gắt nhất là trong lĩnh vực công nghệ, có thể chỉ cần qua một đêm thì bạn đã trở nên “ lỗi thời” là điều không khó gặp. Cho nên, nhất định phải thích nghi với sự thay đổi và biến chuyển liên tục của xã hội và học cách thích nghi nó.
Đừng bao giờ “ngủ quên trong chiến thắng” mà hãy xem đó là động lực để nghĩ ra nhưng xu hướng mới táo bạo hơn.
Sau tất cả, làm sao để trở thành một Product Manager giỏi?
Trước khi trở thành một Product Manager “giỏi”, Thật khó để bỗng dưng được nhảy vào quản lý sản phẩm trong khi bạn chưa bao giờ thật sự làm “quản lý sản phẩm”. Thế làm sao một công ty sẽ cho phép bạn phụ trách sản phẩm của họ nếu bạn chưa bao giờ chịu trách nhiệm về bất kỳ sản phẩm nào?
Một điều không thể bàn lui được: Muốn làm Product Manager thì phải làm Product Manager đã!
Dù cho từ background nào, kiến thức chuyên về cái gì đi chăng nữa, thì bạn phải làm làm Product tại một công ty trước, để “nhúng tay” vào những công việc và process trên trước.
Rèn luyện mindset về product
Phải hiểu sâu sắc sản phẩm hoặc cái bạn đang offer trước, luôn bắt đầu từ những câu hỏi:
Tại sao sản phẩm này tồn tại? Nó đang giải quyết vấn đề gì?
Sản phẩm của bạn phục vụ ai? Ai thì KHÔNG phải đối tượng phục vụ?
Sản phẩm của bạn khác với đối thủ như thế nào?
Sản phẩm của bạn có những tính năng gì? Những tính năng nào nó KHÔNG có?
Với sản phẩm này thì bạn sẽ mang đến cho khách hàng cảm xúc gì?
Tương truyền rằng Product Manager không cần quá nhiều kỹ năng cứng, vào theo dõi quan sát thôi. Thế nhưng như bạn đã thấy đấy, từ Scope of Work đến Quy trình làm việc đâu chỉ dừng ở đấy. Vì thế sẽ không có lý do gì mà bạn không trang bị cho mình một loạt các kỹ năng – kiến thức khác trực tiếp phục vụ cho vị trí cả. Tất cả những kỹ năng mới đều dễ tiếp cận và dễ học cả, chỉ cần một ít commitment và kỷ luật theo xuyên suốt.
Bất kỳ PM nào cũng nên biết CODE một ít cả, đơn giản thì có HTML / CSS / Jquery. Bạn có thể không code cả sản phẩm đấy, nhưng nếu có biết về lập trình thì có khi bạn sẽ trang hoàng sản phẩm nên tốt gấp đôi.
Ngoài ra, như ex-PM huyền thoại Steve Jobs đã dạy chúng ta một điều rằng: Thiết kế rất quan trọng. Mỗi PM đều nên có kỹ năng thiết kế cơ bản. Không cần phải đến như “Pháp sư Photoshop”, nó có nghĩa là các kỹ năng và kiến thức về nguyên lý thiết kế cốt lõi. Lời khuyên này áp dụng không chỉ với B2C đâu, cả các sản phẩm B2B cũng thế.
Xây dựng kỹ năng giao tiếp nhóm
90% khả năng thăng tiến trong sự nghiệp của bạn đến từ các kỹ năng trí tuệ cảm xúc (EQ), chứ không phải IQ, đặc biệt là ở các level cao hơn. Xây dựng kỹ năng giao tiếp và làm việc nhóm là CỰC KỲ quan trọng đối với sự phát triển của bạn. Một nhà Product Manager cần phải là người đồng đội xuất sắc và người có sự đồng cảm cao. Và tin mừng cho các bạn có xu hướng “khô khan”: Các kỹ năng mềm đều học được và rèn dũa được theo thời gian.
Tìm một “mentor” cho chính mình
Có được một người Senior hoặc Mentor đã làm trong ngành của bạn để giúp bạn có cái nhìn sâu hơn về ngành và định hướng nghề sẽ giúp cho bạn thêm nhiều động lực và khả năng để tiến xa hơn với vị trí Product Manager.
Nếu chưa đủ networking, người mentor này cũng không nhất thiết phải là người thân hoặc quen biết cá nhân của bạn. Hãy tìm kiếm thông tin, đọc nhiều – để ý nhiều các sharing định hướng của các Product Manager khác trong ngành, rồi từ đó theo dõi có thể xin “chỉ giáo vài đường” từ họ, quan trọng ở thái độ và cách tiếp cận của bạn.
Các tài nguyên cho Product Manager tương lai
Những đầu sách nên đọc
Product Leadership by Martin Eriksson, Richard Banfield and Nate Walkingshaw
Những câu chuyện làm Product nổi tiếng tại Việt Nam: VNG, Tiki.vn,Thế Giới Di Động,… và nhiều các công ty công nghệ lớn
TopDev Blog cũng sẽ tiếp tục series về Product Manager trong thời gian sắp đến. Đừng bỏ lỡ nhé!
Bạn đã sẵn sàng?
“Hành trình đến Olympia” giới Product đến đây, đương nhiên là chưa chưa đủ. Nhưng đây là một khởi đầu tốt cho bạn.
Điều thú vị về quản lý sản phẩm là không có con đường nhất định để trở thành nhà quản lý sản phẩm. Không cần bằng cấp – rào cản nào ngáng đường bạn đến với vị trí này cả – một vị trí tạo ra một tác động hữu hình thực sự cho công ty của bạn.
Có một sự thật là, những PM tốt nhất trên thế giới đều tự thân vận động (self-taught) mà ra cả.
Nếu thật sự nghiêm túc về quản lý sản phẩm, cách tốt nhất để chuẩn bị là lao thẳng vào đó, lắng nghe và học hỏi kinh nghiệm từ những người khác.
Giải thích một trong những thuật ngữ rất phổ biến của quy trình phát triển phần mềm
Làm trong các công ty phần mềm, bạn sẽ nghe đi nghe lại mấy chữ này Scrum, Agile, planning poker, Stand up, Sprint. Nó là những thuật ngữ được dùng ám chỉ một quy cách tổ chức công việc, xét độ ưu tiên, và phân phối những công việc này giữa các thành viên trong team.
Agile và Scrum hay đi chung, nhưng nó khác nhau (không lớn lắm).
Agile là phương pháp được sáng tạo bởi Agile Manifesto, nó là lý thuyết nền tảng
Scrum là một framework hiện thực hóa từ đóng lý thuyết hầm bà lằng của Agile
Ví dụ đi tập gym, bạn muốn tăng cơ giảm mỡ, trong đó bạn sẽ có rất nhiều dạng bài tập, thích tay to, chân to, ngực to, mông to,… thì có những bài tập khác nhau để chọn. Scrum là một trong những dạng bài tập như thế. Agile là quy định của phòng tập, bạn phải đến đó 3 ngày một tuần, một buổi 2 tiếng.
Về nguồn gốc, Agile được sử dụng rộng rãi trong các công ty Nhật Bản từ những thập niên 70, 80 như Toyota, Fuji, Honda
Vào giữa những năm 90, Jeff Sutherland cảm thấy quá bực bội vì công ty của ông ta liên tục dính những dự án trễ kế hoạch, vượt ngân sách. Anh ấy đi tìm giải pháp cho vấn đề này, đọc thấy Agile, anh bắt đầu “chế” Scrum, và nó nhanh chóng được cộng đồng công nghệ sử dụng rộng rãi.
Nói Scrum chỉ thật sự có ích cho kỹ sư, lập trình viên thấy không đúng. Scrum còn mang đến nhiều lợi ích khác cho nhiều loại dự án khác nữa, vì ngay từ đầu người sáng tạo ra Agile không phải để dùng riêng cho ngành phần mềm.
David Matthew có phát biểu: “Nếu bạn đang làm việc trong lĩnh vực marketing, cần viết một văn bản cho dự án, sử dụng Scrum không chỉ giúp bạn cấu trúc bài viết của bạn tốt hơn, nó còn giúp các thành viên trong team hiểu vấn đề tốt hơn”
Scrum đang được dùng rộng rãi bởi FBI, các bạn làm marketing, những đội ngũ xây dựng (đang nói ở nước ngoài nhé). Miễn bạn đang cần làm một sản phẩm, một phần mềm, chiến dịch quảng cáo, Scrum có thể giúp team của bạn vận hành có tổ chức hơn, làm mọi thứ nhanh hơn.
Vai trò và các phần của Scrum
Bạn không cần gì nhiều để bắt đầu với Scrum, bạn chỉ một nơi để tổ chức các ý tưởng của mình, hoặc gọi là Backlog, bạn cần những người cho những vai trò khác nhau, product owner, Scrum master
Product owner là người quan tâm đến sản phẩm cuối cùng, người có quyền quyết định sản phẩm cuối cùng sẽ có gì. Người này sẽ đảm nhiệm việc tạo backlog – một tập các công việc cần làm, tập các yêu cầu cần có cho sản phẩm. Yêu cầu bắt buộc của Backlog là nó phải có thứ tự ưu tiên, product owner phải quyết định cái nào trước cái nào sau. Ví dụ nếu đang chế một cái xe thì động cơ phải nằm trên mục cao nhất của yêu cầu, được sơn màu đỏ thì có thể nằm ở cuối danh sách.
Sprint là một khung thời gian cố định mà toàn bộ team phải xong một phần công việc được quy ước trong backlog. Thời gian dài ngắn tùy thuộc vào yêu cầu của team, 2 tuần là lựa chọn phổ biến.
Daily scrum là một một buổi họp hằng ngày để cập nhập tình hình công việc, còn gọi là Daily stand up
Kết thúc mỗi Sprint là tổng kết, đánh giá cuối năm học, mọi người xem lại công việc của mình, bàn luận những thứ có thể cải thiện cho Sprint sau.
Như bạn thấy, không có gì yêu cầu đặc biệt về thiết bị hay training để bắt đầu. Phần khó nhất chỉ là phân biệt được từng khái niệm, làm đúng vai trò và đọc kỹ hướng dẫn sử dụng trước khi dùng.
Khi bắt dầu dàn trang design cho web, hãy sử dụng những hệ thống grid phổ biến hiện nay như Bootstrap Grid. Nếu bạn là designer mà chưa biết đến CSS framework này thì thiệt thiếu xót trầm trọng…
Tác giả: Lưu Bình An
Grid
Khi bắt đầu dàn trang cho web, sử dụng những hệ thống grid phổ biến hiện nay như Bootstrap Grid. Nếu bạn là designer mà chưa biết đến CSS framework này thì thiệt thiếu xót trầm trọng, nó giải quyết phần lớn các yêu cầu cơ bản về layout, thống nhất sử dụng ngay từ đầu sẽ giúp ít rất nhiều cho mấy anh developer. Quan trọng nhất nên lưu ý là hệ thống grid ngày nay sử dụng độ rộng tương đối (theo giá trị phần trăm của container) và khoảng cách padding cố định. Bạn có thể đọc bài viết sau để hiểu cách xây dựng hệ thống grid trên Sketch
Khi sử dụng hệ thống grid như bootstrap bạn sẽ không bao giờ cần phải nói cho anh developer kích thước của từng cột là mấy, vì thực sự lúc này kích thước nó chỉ là một giá trị tương đối
Responsive design
Bạn designer chỉ cần chỉ cho anh developer từng element nó sẽ như thế nào trên các kích thước màn hình khác nhau, luôn luôn nghĩ các element có một kích thước tương đối chứ không phải một giá trị cố định nào đó như 320 – 1024 -1920, vì giao diện responsive phải có khả năng thích nghi với nhiều dạng kích thước màn hình khác nhau nữa.
Không chỉ vậy, một số hình có kích thước phụ thuộc vào container của nó, ví dụ trên desktop bạn cho một cái hình kích thước 200×200, nhưng trên điện thoại kích thước của màn hình sẽ là 375×667 đi, thì các hình này chắc chắn bể liền, thường thấy trên mấy cái thumbnail bài viết.
Một lỗi thường thấy khác là quên rằng độ cao của một số element sẽ thay đổi theo container
Sử dụng những breakpoint căn bản: 320-375-768-1024-1280-1366-1920. Và tất nhiên tất cả các anh designer đều quên là giao diện đôi khi được xem trên màn hình lật ngang ra.
Ví dụ bên dưới 2 cột hiển thị rất đẹp trên desktop nhưng do sự thay đổi độ cao trên mobile mà nó sẽ trở nên xấu xí
Đừng sáng tạo ra cái có sẵn
Nếu không có thời gian, hoặc không chắc có thể customize những component nhỏ xíu như cái dropdown theo kiểu “thích vẽ sau vẻ”, hỏi anh developer xem anh có suggest cái thư viện nào có sẵn, thay vì làm lại cái người ta đã làm tốt lắm rồi. Một ví dụ kinh điển là cái datepicker. Rát nhiều designer nghĩ chỉ cần vẽ cái lịch với con số trên đó, mà quên rằng
Hover effect trên từng ngày
Trạng thái ngày hiện tại
Làm sao đánh dấu ngày được chọn
Làm sao thay đổi tháng, năm
Ngày trước và sau của tháng hiện tại
Chúng ta đang sống trong cái thời đại mà mọi người đều cố xây dựng mọi thứ của riêng mình (style Nhật). Đôi khi, có một sản phẩm chạy được cho khách hàng thì tốt hơn là lãng phí thời gian và tiền bạc cho một anh designer ngồi đó sáng tạo ra những thứ người ta đã có sẵn. Designer phải biết rằng anh có thể sử dụng những thư viện và component có sẵn để hoàn tất project. Nó sẽ giảm đi effect không chỉ của designer mà còn cả developer ngồi đó tìm ra những giải pháp không thực sự cần thiết
Hiệu ứng
Một số tool cho designer như InVision, Axure để biểu diễn flow, Principle, Framer, Adobe After Effect để mô tả hiệu chạy thế nào. Nó sẽ giảm đi những hiểu nhầm giữa designer và developer, khách hàng.
UI kits
UI kit là tất cả những element bạn đang sử dụng trong project, nếu là dân React có thể gọi là component. Sau này khi muốn maintenance sẽ dễ dàng hơn khi dự án ngày càng phình ra.
Trong cái UI kit cần xác định những thành phần: bảng màu sử dụng, typography, các component như button, input, slider, hover, active state, cũng như người lập trình luôn tâm niệm nếu lập lại một đoạn code một lần thứ 2 trong đời thì cho nó ngay vào thư viện để tái sử dụng. Thường khi các bạn designer không có làm kiểu này thì trước sau gì cũng xảy ra trường hợp cùng một button mà chỗ này khác chỗ kia khác một chút, mà các bạn tester và khách hàng khác cái giao diện là đè đầu thằng developer ra chửi, trong khi cái đó nhiều khi bạn designer không cố ý mà vô tình quên mất mình đã format cái button đó ở đâu đó rồi.
Các bạn design hay chỉ làm mỗi cái trạng thái default mà quên rằng một element sẽ có rất nhiều state khác như, như active, hover, focus, visited
Line-Height
Có thể khẳng định là 100% anh designer sẽ không để ý đến giá trị này, mà cứ đè ra đo độ cao chính xác từng pixel của element, trong khi không hề biết cái line-height sẽ ảnh hưởng đến độ cao này, đâm ra anh quên cộng vào, và khi anh developer set cái padding trong code là 13, 14 thì anh la làng là nó phải 20, trong khi nếu cộng vào cái line-height nữa nó sẽ ra là 20.
Một ưu điềm khác khi sử dụng Sketch là lúc làm sẽ thấy ngay sự ảnh hưởng line-height, trong khi photoshop thì sẽ không thấy được
Giá trị line-height nên không nên thay đổi nhiều quá trên từng element mà thống nhất xài chung một kiểu
Font
Trước hết, xác định là: “LUÔN LUÔN sử dụng Google Fonts” nếu muốn xài một font không có sẵn trong máy, bạn developer sẽ không phải đi mò mẫm convert cái font chữ của bạn design chôm ở đâu đó, một công việc vốn quá nhiều rủi ro do vấn đề bản quyền, vấn đề lỗi convert có thể xảy ra, lỗi hiển thị trên các trình duyệt khác nhau.
Cũng không bao giờ được xài nhiều hơn 2 font ngoài hệ thống, quá nhiều font phải load, làm ảnh hưởng tốc độ load site. Không sử dụng quá nhiều font style italic, bold, light, thin, regular, một đóng hầm bà lằng, luôn nhớ trong đầu less is more
Kết
Thằng designer thì vốn không ưa thằng developer, chê thằng developer không thấy được sự sáng tạo của nó, còn thằng developer thì luôn chửi thằng designer, nó cứ chế biến mấy cái tào lào khó implement chết mịa luôn. Tất cả những vấn đề trên có thể giải quyết bằng một cách thôi: TRAO ĐỔI. Trao đổi càng sớm, trao đổi khi có vấn đề sẽ tránh cho ra kết quả mà nhìn vào không dám nhận là con của mình. Với tất cả những dự án dù lớn hay nhỏ thì luôn luôn bạn phải cân đối giữa kết quả mong muốn, thời gian và chi phí phải bỏ ra
Với mong muốn mang đến càng nhiều cơ hội để các startup Việt khôi phục sau giai đoạn khó khăn do COVID-19 và lấy đà tăng tốc phát triển mạnh mẽ, cuộc thi “K-Startup Grand Challenge 2020 (KSGC 2020)” là sân chơi khởi nghiệp quốc tế hỗ trợ các startup phát triển tại thị trường Hàn Quốc và lấy đà mở rộng thị trường ra toàn châu Á. Đến năm 2019, cuộc thi đã nhận được 7402 đơn đăng ký dự thi từ 151 quốc gia với hơn 1.2 tỉ USD vốn đầu tư Startup được xúc tiến.
Chinh phục thị trường quốc tế – Câu chuyện không mới
Mở rộng thị trường ra nước ngoài là một bài toán khó mà nhiều doanh nghiệp khởi nghiệp (startup) Việt Nam luôn muốn chinh phục khi phát triển. Mở rộng thị trường ra các nước khác đồng nghĩa với mở rộng nguồn doanh thu cho doanh nghiệp, hạn chế bị ảnh hưởng từ các yếu tố bên ngoài tại một khu vực. Đồng thời, startup có thể mở rộng kết nối, nhận được hỗ trợ từ nhiều nguồn lực hơn và nhất là các quỹ đầu tư quy mô lớn trên toàn cầu.
Từ các startup có kinh nghiệm tiếp cận thị trường quốc tế, nhiều vấn đề và khó khăn đã được đặt ra: từ ngôn ngữ và thói quen tiêu dùng khác nhau của thị trường, chính sách pháp lý khác biệt, niềm tin của thị trường mới vào sản phẩm nước ngoài, khả năng tồn tại trong quá trình thử nghiệm thị trường,… Startup cần tự mình giải quyết rất nhiều vấn đề nếu như không tìm được một cố vấn hoặc chuyên gia quốc tế hỗ trợ, không kết nối được với đơn vị hỗ trợ khởi nghiệp tại khu vực mục tiêu hoặc không có đủ nguồn lực tài chính để duy trì vận hành.
Bước đệm để khôi phục và phát triển sau đại dịch
Với mong muốn mang đến càng nhiều cơ hội để các startup Việt khôi phục sau giai đoạn khó khăn do COVID-19 và lấy đà tăng tốc phát triển mạnh mẽ, cuộc thi “K-Startup Grand Challenge 2020 (KSGC 2020)” là sân chơi khởi nghiệp quốc tế hỗ trợ các startup phát triển tại thị trường Hàn Quốc và lấy đà mở rộng thị trường ra toàn châu Á. Đến năm 2019, cuộc thi đã nhận được 7402 đơn đăng ký dự thi từ 151 quốc gia với hơn 1.2 tỉ USD vốn đầu tư được xúc tiến.
Startup Xtaypro đến từ Việt Nam đoạt giải 3 tại vòng chung kết K-Startup Grand Challenge 2018
Được tổ chức thường niên từ năm 2016 bởi Chính phủ Hàn Quốc, KSGC 2020 hướng tới thúc đẩy sự phát triển của các Startup tiềm năng thông qua việc đấu nối các nguồn lực hỗ trợ cần thiết và giúp các Startup mở rộng thị trường tại các nước châu Á với bước đệm là thị trường Hàn Quốc. Với cam kết đồng hành từ các công ty nổi tiếng toàn cầu của Hàn Quốc như Samsung, LG, Huyndai, Naver và Lotte,… các startup tham gia cuộc thi sẽ được tiếp cận với mạng lưới các cố vấn, nhà sáng lập, các chuyên gia và nhà đầu tư rộng khắp thế giới.
“Dự án của chúng tôi đã phát triển vượt bậc kể từ khi bắt đầu tại Hàn Quốc. Chúng tôi đã thiết lập mối quan hệ với các nhà tài trợ và các thương hiệu lớn, cùng với đó là lượng truy cập website và người dùng tăng cao bất ngờ” – Hannah Waitt, CEO moonROK Media chia sẻ về những thành tựu đạt được sau khi tham gia cuộc thi KSGC 2019.
Năm 2020, Trung tâm Hợp tác CNTT Hàn Quốc tại Hà Nội (KICC), thuộc Cơ quan Xúc tiến Công nghiệp CNTT Hàn Quốc (NIPA) là đơn vị chịu trách nhiệm triển khai cuộc thi tại Việt Nam đã công bố các thông tin chi tiết về cách thức và quyền lợi dành cho các Startup tham gia.
Năm 2019, giải thưởng dành cho đội quán quân là 100.000USD cùng nhiều cơ hội kể nối với các quỹ đầu tư và tập đoàn lớn trong khu vực
Đối tượng tham gia:
Dự án khởi nghiệp:
Có thời gian hoạt động dưới 7 năm
Có ít nhất 01 thành viên đôi ngũ sáng lập là người có quốc tịch tại 01 trong các quốc gia: Việt Nam, Lào, Myanmar, Campuchia, Philippin, HongKong và Đài Loan.
Được kết nối với các quỹ đầu tư hàng đầu tại khu vực châu Á
Được nghiên cứu, phát triển, kiểm tra sản phẩm tại phòng nghiên cứu với các chuyên gia.
Được chính phủ Hàn Quốc hỗ trợ để định cư và thiết lập cơ sở kinh doanh tại Hàn Quốc
Được sự tư vấn giúp đỡ tận tình từ các chuyên gia chuyên môn đến từ các tập đoàn lớn tại Hàn Quốc và châu Á.
Kết nối, hợp tác với các đối tác lớn tại thị trường Hàn Quốc.
Top 60 sẽ tham gia chương trình tăng tốc khởi nghiệp kéo dài 3.5 tháng tại Hàn Quốc (có kinh phí hỗ trợ lên đến 15.490 USD/đội) và trình bày sản phẩm trước các nhà đầu tư tại Demo Day
Top 30 sẽ tham gia chương trình hỗ trợ thành lập tại Hàn Quốc kéo dài 3.5 tháng tiếp theo (có kinh phí hỗ trợ lên đến 15.490 USD/đội)
Đâu là những kiến thức cần có khi học lập trình java làm backend web developer? Để tìm hiểu và học Java bạn nên bắt đầu nắm vững những khái niệm cơ bản nhất. Từ đó khai triển lên kiến thức nâng cao hơn. Vậy các keyword chính khi học Java để trở thành một Java Web Developer là gì?
Java là một trong những ngôn ngữ bậc cao được nhiều công ty và các tổ chức trên thế giới tin dùng, ngôn ngữ Java được thiết kế vào những năm 90s bởi tổ chức Sun Micro system hiện nay thuộc sở hữu của Oracle. Java có tính độc lập rất cao, tiện lợi, có thể dùng cho việc cross-platform, có nghĩa bạn chỉ cần viết chương trình một lần thì có thể chạy trên nhiều nền tảng khác nhau. Khẩu hiệu kinh điển mà bất kỳ dân lập trình Java nào cũng biết đó là “Viết một lần, chạy được khắp nơi” (Write Once Run Anywhere).
Học Java căn bản thì bắt đầu từ đâu?
Để bắt đầu học lập trình Java, bạn phải cần thông thạo các ngôn ngữ lập trình hướng đối tượng, có thể học qua lập trình C để làm quen với những khái niệm của loại lập trình này cũng như có thể hiểu sâu hơn về Java và các công nghệ Java mà nhiều người thường sử dụng như:
Nhắc đến Java backend developer chắc chắn phải nằm lòng kiến thức căn bản của ngôn ngữ lập trình java: JAVA CORE là kiến thức nền tảng của ngôn ngữ lập trình JAVA, nó sẽ là bước khởi đầu để bạn có thể học những kiến thức nâng cao như: JSP- Servlet – Android.
Java là ngôn ngữ lập trình hướng đối tượng (OOP)
Lập trình hướng đối tượng (OOP) là một kỹ thuật lập trình cho phép lập trình viên tạo ra các đối tượng trong code trừu tượng hóa các đối tượng. Đối tượng là những sự vật, sự việc mà nó có những tính chất, đặc tính, hành động giống nhau và ta gom góp lại thành đối tượng giống trong thực tế cuộc sống. Khi lập trình OOP, chúng ta sẽ định nghĩa các lớp (class) để gom (mô hình) các đối tượng thực tế.
Cách sử dụng câu điều kiện: if/else
Trong ngôn ngữ lập trình Java cũng như các ngôn ngữ lập trình khác, cấu trúc điều khiển if – else sẽ kiểm tra kết quả của 1 điều kiện và dựa vào kết quả đó để thực hiện các hành động tương ứng. Có bốn loại câu lệnh if trong java: Câu lệnh IF; Câu lệnh if -else; Câu lệnh if -else -if; Câu lệnh if lồng nhau.
Sử dụng vòng lặp: for/while
Vòng lặp for trong java được sử dụng để lặp một phần của chương trình nhiều lần. Nếu số lần lặp là cố định thì vòng lặp for được khuyến khích sử dụng, còn nếu số lần lặp không cố định thì nên sử dụng vòng lặp while hoặc do while. Có 3 kiểu của vòng lặp for trong java: Vòng lặp for đơn giản; Vòng lặp for cải tiến; Vòng lặp for gán nhãn.
Exception là gì và cách xử lý exception (xử lý ngoại lệ) trong Java
Exception trong Java được xem là một sự kiện làm gián đoạn luồng làm việc bình thường của chương trình đó. Nó là một đối tượng được ném ra tại runtime. Cụ thể là khi một chương trình đang chạy exception sẽ khiến nó lập tức dừng lại và xuất hiện thông báo lỗi. Một ví dụ trực quan nhất là khi bạn tiến hành thực hiện phép chia một số nguyên dương cho số 0 thì khi biên dịch chương trình sẽ làm phát sinh lỗi và đó được coi là ngoại lệ.
Checked Exception
Check Exception là các Exception xảy ra tại thời điểm Compile time (là thời điểm chương trình đang được biên dịch). Những Exception này thường liên quan đến lỗi cú pháp (syntax) và bắt buộc chúng ta phải “bắt” (catch) nó.
Unchecked Exception
Unchecked Exception được xem là các Exception xảy ra tại thời điểm Runtime (là thời điểm chương trình đang chạy). Những Exception này thường liên quan đến lỗi logic và không bắt buộc chúng ta phải “bắt” (catch) nó.
Các cấu trúc dữ liệu: chuỗi, mảng, HashMap, LinkedList
Đối với các ngôn ngữ lập trình, chuỗi và mảng là 2 kiểu dữ liệu rất quan trọng. Trong ngôn ngữ lập trình Java, chuỗi được coi là 1 dữ liệu dạng đối tượng (tức là nó có các thuộc tính và phương thức – chi tiết về đối tượng chúng ta sẽ được học trong chương Lập trình hướng đối tượng).
Trong lập trình Java, mảng (array) là một tập hợp các phần tử có cùng kiểu dữ liệu, có địa chỉ tiếp nhau trên bộ nhớ (memory). Mảng có số phần tử cố định và bạn không thể thay đổi kích thước của nó.. Mỗi phần tử của mảng được sử dụng như là một biến đơn, kiểu dữ liệu của mảng chính là kiểu dữ liệu của phần tử.
Mảng được sử khá nhiều, có tính ứng dụng cao không chỉ bởi sự đơn giản cũng như khả năng đáp ứng nhu cầu lưu trữ dữ liệu trong các bài toán thực tế. Các lập trình viên có nhiều kinh nghiệm thường sử dụng mảng khi cần lưu trữ nhiều giá trị, chẳng hạn như lưu trữ các số nguyên từ 1 đến 5; dãy 32 chuỗi ký tự v.v…
Trong Java, mảng được hỗ trợ dưới dạng mảng một chiều cho đến mảng nhiều chiều. Tuy nhiên tối đa chỉ sử dụng mảng ba chiều và được dùng nhiều nhất là mảng một chiều.
Ví dụ về cách khai báo 1 mảng trong Java
// Khai báo một mảng, chưa chỉ rõ số phần tử.
int[] array1;
// Khởi tạo mảng với 100 phần tử
// Các phần tử chưa được gán giá trị cụ thể
array1 = new int[100];
// Khai báo một mảng, và chỉ rõ số phần tử
// Các phần tử chưa được gán giá trị cụ thể
double[] array2 = new double[10];
// Khai báo một mảng với các phần tử được gán giá trị cụ thể.
// Mảng này có 4 phần tử
long[] array3= {10L, 23L, 30L, 11L};
Java còn là ngôn ngữ lập trình đa luồng multithreading
Trong Java có hai khái niệm multi: multithreading (đa luồng) và multitasking (đa tiến trình). Đa luồng khi chương trình đó có 2 luồng trở lên chạy song song với nhau và một luồng (thread) là đơn vị nhỏ nhất của tiến trình (process). Trong đó, luồng – đơn vị nhỏ nhất trong chương trình có thể thực hiện được một công việc riêng biệt, được quản lý bởi máy ảo Java. Bốn thành phần chính của một luồng bao gồm: định dang, một bộ đếm chương trình, một tập thanh ghi và ngăn xếp. Một ứng dụng Java ngoài luồng chính có thể có các luồng khác thực thi đồng thời. Với đa luồng, công việc của Java được xử lý nhanh chóng hơn.
Ví dụ khai báo mảng 2 chiều
// Khai báo một mảng có 5 dòng, 10 cột
MyType[][] myArray1 = new MyType[5][10];
// Khai báo một mảng 2 chiều có 5 dòng.
// (Mảng của mảng)
MyType[][] myArray2 = new MyType[5][];
// Khai báo một mảng 2 chiều, chỉ định giá trị các phần tử.
MyType[][] myArray3 = new MyType[][] {
{ value00, value01, value02 , value03 },
{ value10, value11, value12 }
};
// ** Chú ý:
// MyType có thể là các kiểu nguyên thủy (byte, char, double, float, long, int, short, boolean)
// hoặc là kiểu tham chiếu.
Khi làm việc phía backend, Java developer cần thao tác nhiều với dữ liệu và làm sao để xử lý luồng dữ liệu nhanh nhất và chính xác nhất.
Cấu trúc dữ liệu và giải thuật được xem là 2 yếu tố quan trọng trong lập trình. Data structure bao gồm 3 mức độ: cơ bản: stack (ngăn xếp), queue (hàng đợi), linkedlist (danh sách liên kết), binary tree (cây nhị phân); trung bình: Heap, Priority queue, Huffman Tree, Hash Table (Bảng băm); nâng cao: segment Tree, Binary Indexed Tree, Spare Table, ….
JSP và Servlet
Sau khi đã nắm vững các khái niệm Java core cùng cấu trúc dữ liệu và giải thuật, bạn sẽ cần học thêm về JSP và Servlet. Trong quá trình học, bạn sẽ biết đến J2EE, là nền tảng lập trình cho các ứng dụng phân tán (trong đó web chính là nền tảng dạng như ứng dụng phân tán), từ đó tiếp cận với các khái niệm mới như API, SML, JDBC, JMS.
Enterprise và Java Beans
Enterprise Java Beans (EJB) là một thành viên trong gia đình J2EE, là nền tảng có nhiệm vụ xây dựng các thành phần phần mềm có tính di động và có thể reusable (sử dụng lại). Từ đó các developer có thể xây dựng và triển khai các distributed application (ứng dụng phân tán) dễ dàng, thuận lợi hơn.
Đích đến của EJB là các enterprise (ứng dụng thương mại), lớn, phân tán. Từ đó, EJB có nhiệm vụ quy định kiến trúc và đặc tả cho việc phát triển và triển khai các component (thành phần) thuộc server-side của distributed application. Các component này được các tổ chức phát triển build ứng dụng hay được một bên thứ ba mua laị.
JDBC và RMI là gì?
JDBC là Java API có nhiệm vụ kết nối và thực hiện truy vấn database (cơ sở dữ liệu), sử dụng trình điều khiển JDBC để kết nối với database. Trước JDBC, ODBC được sử dụng để làm nhiệm vụ trên, tuy nhiên ODBC đuợc biết bằng nền tảng phụ thuộc (ngôn ngữ C) nên Java đã tự định nghĩa API của chính mình và sử dụng JDBC được viết trên nền tảng Java.
Java RMI (Remote Method Invocation – Gọi phương thức từ xa): một kỹ thuật của Java cài đặt distributed object (đối tượng phân tán) hiệu quả và linh động.
Một số đặc tính của RMI:
Là mô hình distributed object của Java, giúp truyền thông giữa các distributed object dễ dàng hơn.
API bậc cao xây dựng dựa trên lập trình socket.
Không những cho phép truyền data giữa các object trên các hệ thống khác nhau mà còn gọi được các phương thức trong các đối tượng remote.
Quá trình truyền data giữa các máy được xử lý trong suốt với Java virtual machine (máy ảo Java).
Cung cấp callback, cho phép Server gọi ngược phương thức ở Client.
Các framework của Java gồm những gì?
STRUTS
SPRINGS
Đây là hai framework khá lâu đời và được phát triển dựa trên nền tảng của J2EE, hỗ trợ việc xây dựng web bằng ngôn ngữ Java theo hướng MVC: viết tắt cho model view controller, một pattern khá nổi tiếng khi thiết kế phần mềm.
Trong quá trình học Springs/struts bạn cũng cần tìm hiểu về thư viện liên quan tới thao tác về mặt database trong ứng dụng S/S: JPA hay Hibernate. mvc
Tham khảo lộ trình chi tiết khi học ngôn ngữ Java qua roadmap dưới đây:
Lượng kiến thức phải học Java để theo con đường web developer không phải là ít, cũng không thể hoàn thành trong một sớm một chiều. Cách nhanh nhất và học hiệu quả nhất của người theo đuổi Java Developer chính là định hướng rõ ràng, đặt mục tiêu và dành thời gian, công sức một cách nghiêm túc.
Các tài liệu lập trình Java từ căn bản nâng cao
Ngoài những nội dung như trên, TopDev xin được phép chia sẻ thêm một số tài liệu tiếng Anh và Việt dành cho những người mới cũng như những ai có kinh nghiệm về Java.
Tài liệu Java cơ bản của Đại Học Quốc Gia Hà Nội
Chú ý đây là giáo trình dành cho những người đã có một ít kiến thức về Java bao gồm 58 chương từ cơ bản đến nâng cao. Bạn có thể tự học bằng tại liệu này một cách rất dễ dàng.
Ngoài mục đích thực hành các nội dung liên quan đến lập trình hướng đối tượng, các bài tập thực hành của môn học này nên có thêm đóng vai trò định hướng và gợi ý giúp đỡ các lập trình viên tự học các chủ đề thuần túy Java, hiểu sâu những giá trị cốt lõi để có thể phát triển hơn trong tương lai.
Các thuật ngữ hướng đối tượng nguyên gốc tiếng Anh đã được chuyển sang tiếng Việt theo những cách khác nhau tùy các tác giả. lập trình viên cần biết thuật ngữ nguyên gốc tiếng Anh cũng như các cách dịch khác nhau đó để tiện cho việc sử dụng tài liệu tiếng Anh cũng như để liên hệ kiến thức giữa các tài liệu tiếng Việt. Vì lí do đó, giáo trình này cung cấp bảng thuật ngữ Anh-Việt với các cách dịch khác nhau tại Phụ lục C, bên cạnh Phụ lục A về công cụ lập trình JDK và Phụ lục B về tổ chức gói của ngôn ngữ Java
Blog học lập trình Java căn bản đến nâng cao đầy đủ nhất
Hơn hẳn những khóa học hàn lâm, học qua blog là một trong những cách thiết thực nhất giúp bạn có thể nắm được những kinh nghiệm được truyền từ những đàn anh đi trước. Hãy cùng xem qua những blog học lập trình Java mà bạn có thể tham khảo trực tiếp nhé.
Có lẽ việc học lập trình tốt nhất vẫn chính là học qua website chính thức của chính ngôn ngữ lập trình Java. Tại website chính thức của Java bạn cũng có thể được học trực tiếp từ những chuyên gia của họ, đồng thời tham gia các workshop cũng như webinar rất hữu ích.
Ngoài ra bạn cũng có thể tham khảo thêm những nội dung của trang FreeJavaGuide và trang laptrinhjavaweb, đây cũng là một trong những nơi có chứa đầy đủ nhất thông tin cho những ai cần tham khảo và tìm hiểu thông tin về lập trình Java.
Đã bao giờ bạn tự hỏi bản thân rằng liệu mình có yêu thích công việc này hay không? Liệu mình có thể theo đuổi nó trong mỗi quãng thời gian dài hay không? Mình đã tự hỏi bản thân mình như thế mỗi sáng thức dậy, liệu mình đã chọn đúng công việc, đúng con đường hay chưa?
Mình là một lập trình viên – một công việc mà mọi người nhìn vào sẽ nghĩ tới một mức lương cao ngất ngưởng, một công việc rất là “ngầu”, một công việc mà ai cũng phải ngưỡng mộ. Hành trình làm một dev của mình bắt đầu từ năm 2012, với vị trí thực tập sinh C++. Thẳng thắn mà nói, mình thực sự không có một chút ý tưởng nào cho công việc mình đang làm vào thời điểm ấy. Với tâm lý của một thằng thực tập sinh vắt mũi chưa sạch mới đi làm lần đầu, mình thực sự không có một chút định hướng nào cho công việc của mình. Tuy nhiên, mình cũng đã cố gắng theo đuổi và trụ vững tới bây giờ đã được 7 năm. Hôm nay, mình xin chia sẻ lại với các bạn những kinh nghiệm làm lập trình viên quý báu mà mình nhận được thông qua con đường 7 năm này.
Thử đặt câu hỏi: Mình nên dùng ngôn ngữ nào để giao tiếp với mọi người?
Đó là tiếng Anh? Tiếng Tây Ban Nha? Tiếng Trung? Hay là tiếng Nhật? Thời điểm đó mình đã ứng tuyển vào một công nước ngoài, trong công ty có rất nhiều nhân viên đến từ các nước khác nhau. Thực sự mình khá lo lắng đến việc phải dùng ngôn ngữ nào để giao tiếp với họ. Tiếng Anh? Okay Mình chọn ngôn ngữ phổ biến này, may mắn thay đó là ngoại ngữ duy nhất mà mình thành thạo.
Qua vấn đề về ngôn ngữ giao tiếp này, mình muốn khuyên các bạn rằng, khi ứng tuyển vào một công ty nào đó, bạn nên tìm hiểu kỹ môi trường làm việc để chuẩn bị sẵn cho mình tâm lý, cũng như những kỹ năng cần thiết nhất, nhất là vấn đề về ngôn ngữ. Nếu không thể giao tiếp với mọi người, hãy từ bỏ công việc đó. Công ty không thể thuê một nhân viên có thể làm việc nhưng “không thể nói” được.
Nói chuyện với mọi người thật sự còn quan trọng hơn cả nói chuyện với cái đống máy móc kia.
Vẫn là vấn đề về giao tiếp, bạn không thể hoàn thành một dự án chỉ với 1 người. Trong một vài trường hợp đặc biệt nào đó, bạn có thể thấy một sản phẩm tuyệt vời nào đó được tạo ra chỉ bởi 1 người (CodeSandbox làm một ví dụ điển hình) nhưng trong phần lớn các trường hợp, một sản phẩm là sự chung sức của cả một tập thể – và điều bạn cần có đó là một team.
Hãy xem việc lập trình như là một môn thể thao, và team của bạn là một đội chơi. Sẽ xảy ra chuyện gì nếu các thành viên trong team không giao tiếp với nhau hay tệ hơn là họ muốn làm việc độc lập không chịu hợp tác ? Trễ deadine, hỏng dự án, cấp trên phê bình, … đó là những gì có thể dễ dàng tưởng tượng ra được nếu trong team bạn xuất hiện hiện tượng đó. Kỹ năng giao tiếp có thể giúp bạn tạo ra hoặc thậm chí là cũng có thể khiến bạn phá hủy cả một dự án. Vấn đề này hoàn toàn phụ thuộc vào cách giải quyết của bạn với mọi người trong team. Nếu không ai đứng ra giải quyết thì chính bạn là người phải có những biện pháp cải thiện vấn đề đó nếu muốn hoàn thành dự án một cách êm đẹp.
Thế mới nói, kỹ năng mềm chuyên nghiệp có thể trở nên quan trọng hơn so với một kỹ thuật nào đó trong sự thành công của một dự án.
Các bạn cần có một sự hiểu biết sâu sắc về những thứ bạn đang làm cũng như là hãy có những câu hỏi vì sao dành cho nó.
Phần lớn mọi người đều sẽ cảm thấy thỏa mãn khi họ nhận thức được mục đích công việc họ đang làm. Áp dụng điều này trong công việc rất là đúng.
Bạn phải hiểu rằng, mục tiêu của các nhà phát triển đó là giải quyết được các vấn đề về code.
Nếu bạn sở hữu một kiến thức sâu rộng về hệ thống mà bạn đang xây dựng hoặc đang duy trì thì đó sẽ là một lợi thế cho bạn. Bạn có thể có những ý tưởng, những quyết định mang thiên hướng không theo lối mòn trước đây. Hãy thử đặt ra những câu hỏi như: chức năng này có thực sự cần thiết hay không? Đoạn code này đang xử lý cái gì? Vấn đề này có cần phải ưu tiên xử lý ngay từ đầu không?
Lối suy nghĩ này sẽ giúp ích cho bạn rất nhiều trong công việc. Nếu bạn muốn làm tốt công việc của mình thì các bạn không nên chỉ hiểu về mục đích của công việc mà còn phải biết định hình cũng như gây ảnh hưởng đến nó nữa. Hãy tận dụng ưu thế về kiến thức sâu rộng của bạn (nếu có) để vươn cao hơn trong công việc.
Nếu các bạn xem việc đánh giá code trong team của mình là một việc căng thẳng thì các bạn đang có lối suy nghĩ sai lầm rồi, thật sự rất sai lầm.
Đối với một nhà phát triển, việc đưa code của mình ra cho cộng đồng đánh giá và thu lại những phản hồi thật sự là những trải nghiệm độc đáo. Cộng đồng có thể chê, có thể khen, có thể giúp bạn cải thiện cũng như tối ưu các đoạn code mà bạn tạo ra. Đừng lo lắng về những lời chê, tất cả mọi người đều có quyền lo lắng về những trải nghiệm của họ đối với sản phẩm, và những sản phẩm đó được tạo ra dưới bàn tay của bạn thì bạn phải có trách nhiệm đảm bảo cho họ có được một sự trải nghiệm tốt nhất có thể.
Bạn đánh giá code của các thành viên trong team và nhận thấy chức năng này hoàn toàn sai nhưng tất cả mọi người lại không có phản ánh gì.
Chúng ta cần một buổi gặp mặt riêng tư, hãy hẹn riêng một người nào đó trong team, nói chuyện và tìm hiểu lý do xem tại sao họ lại thực hiện đoạn code đó theo cách này.
Tất nhiên với tư cách là một nhà phát triển thì không ai muốn viết nên một đoạn code tệ hại cả. Nhưng nếu họ làm vậy, có lẽ họ đang mắc phải một số vấn đề gì đó mà bạn không biết. Nếu họ thật sự không giỏi trong việc lập trình ( có thể là chưa giỏi thôi nhé ), tới lúc cho bạn tỏa sáng dưới vai trò là một người cố vấn rồi đấy.
Một vài rắc rối sẽ xảy ra, hãy luôn trong tư thế chuẩn bị.
Định luật Murphy có một câu ngạn ngữ rằng: “Bất cứ điều gì đó có thể sai sẽ trở thành sai.“
Câu nói đó thật sự rất đúng. Hãy luôn luôn cho rằng một cái đó sẽ xảy ra và phá hủy hệ thống mà bạn đang xây dựng.
Nếu bạn đang thiết kế một form đăng nhập, thử giả định rằng một người dùng nào đó sẽ sao chép và dán toàn bộ nội dung của một cuốn sách nào đó vào phần mật khẩu. Nghe thật tệ cho hệ thống của bạn.
Nếu bạn đang xây dựng một cửa sổ WYSSIWYG, thử tưởng tượng một người nào đó sẽ cố gắng phá hủy nó, và hãy xem như là họ sẽ thành công trong việc đó đi nhé.
Nếu bạn đang có một cơ sở dữ liệu, nó có thể sẽ sập nguồn ở một thời điểm nào đó. Trước đó bạn chưa từng thử phục hồi nó từ dữ liệu sao lưu, chuyện gì sẽ xảy ra? Dữ liệu sao lưu đó có chắc chắn là sẽ hoạt động tốt như bạn nghĩ ?
Hãy lường trước mọi rắc rối mà có thể xảy ra – trong khả năng của bạn, lên kế hoạch sẵn sàng cho những rắc rối đó. Tin mình đi, việc này không hề thừa thãi vô ích đâu.
Đừng sợ khi phải nói “Mình không biết”
Điều tốt nhất khi bạn có một người cấp trên ở bên cạnh trong công việc đó là bạn có thể nói: “Mình không biết, mình chưa bao giờ thử nó trước đây. Mình sẽ xem xét lại và phản hồi sớm nhất lại cho bạn “
Khi mình còn là một junior, mình thực sự rất sợ khi phải nói “ Mình không biết “ về một vấn đề nào đó. Kết quả của nỗi sợ đó là gì, mình phải tốn thêm thời gian để tìm hiểu về các vấn đề mình không hiểu thay vì thú nhận với cấp trên là mình không biết gì về nó và cần họ giúp đỡ. Tin mình đi, không ai phê bình bạn khi bạn nói câu “ Mình không biết “ cả, trung thực sẽ tốt cả hai bên. Bạn hiểu được vấn đề nhanh hơn, đỡ mất thời gian, cấp trên thì đảm bảo dự án của họ sẽ được hoàn thành đúng hạn và chất lượng được đảm bảo.
Học từ cộng đồng
Đã bao giờ bạn nghĩ bạn sẽ chia sẻ những kiến thức mình ra cho cộng đồng ? Bạn có tự tin là mọi kiến thức bạn biết là đã quá đủ ? Hãy thử viết blog, quay một video, hay tạo một sự kiện về chia sẻ kiến thức gì đó ở công ty hoặc thậm chí đơn giản là … chia sẻ kiến thức với một người bạn trong một buổi cà phê ngẫu hứng nào đó. Tin mình đi, kết quả thu về sẽ khiến bạn bất ngờ đấy, có thể sẽ xuất hiện ra những phản hồi thú vị nào đó, những thủ thuật hay ho mà bạn chưa hề biết, thậm chí là một phản bác nào đó khiến bạn phải chú ý và thảo luận với họ về nó. Học hỏi luôn là một điều tốt, nếu bạn nghĩ rằng phải có sự rõ ràng giữa cấp trên với cấp dưới thì hãy bỏ ngay đi nhé. Ngay cả những người cấp trên cũng có một cái gì đó để học hỏi từ những người mới bắt đầu và ngược lại.
Chỉ bảo là một hành động đáng để thử để thể hiện được sự đảm bảo về độ hiểu biết của bạn về chủ đề đang nói.
Và bây giờ, những bài học nào mà các bạn đã có được khi là một nhà phát triển?
Nếu dùng loop mặc định của Youtube thì sẽ nghe đi nghe lại cả bài. Tuy nhiên, tớ chỉ thích nghe đoạn hát thôi, không thích nghe đoạn intro và outro ở đầu. Vì vậy tớ viết 1 đoạn script nho nhỏ, paste vào console để thực hiện thủ đoạn này, tiện share với mọi người luôn.
TL; DR
function simpleLoop(startTime, endTime) {
// TODO: Check valid endtime
console.log('-- Run here')
var ytplayer = document.getElementById("movie_player");
var currentTime = ytplayer.getCurrentTime();
var isRunToStart = currentTime > startTime
var suitableTimeout = endTime - startTime
if (currentTime <= startTime || currentTime > endTime){
ytplayer.seekTo(startTime)
} else {
suitableTimeout = endTime - currentTime
}
console.log('>> Start timeout after: ', suitableTimeout * 1000)
setTimeout(function () {
simpleLoop(startTime, endTime)
}, suitableTimeout * 1000)
}
simpleLoop(11, 254)
Thay trong hàm simpleLoop là startTime và endTime mà bạn muốn.
Giải thích
Đoạn code trên khá đơn giản, có thể hình dung theo sơ đồ sau:
Nếu thời gian hiện tại của video nhỏ hơn hoặc bằng thời gian bắt đầu, hoặc lớn hơn thời gian kết thúc của đoạn mà bạn muốn lặp => đang ở đoạn mà bạn không muốn nghe => phi trâu ngay đến đoạn bắt đầu + đặt thời gian timeout là 1 chu kì (endTime – startTime)
Ngược lại, nếu thời gian hiện tại đang ở đoạn muốn nghe, thời gian timeout sẽ là từ thời điểm hiện tại cho tới thời điểm kết thúc.
Sau khi tính toán được thời gian timeout, thực hiện gọi đệ quy lại chính hàm check này.
Lưu thành tool
Để cho tiện, tớ lưu lại thành tool vào thanh bookmark bar của chrome. Đoạn code dưới đây có thêm phần nhập vào start time và end time, để bạn có thể dễ dàng sử dụng Các bước lưu như sau:
Lưu 1 bookmark bất kì
Thay thế phần URL bằng đoạn code dưới đây
javascript: !function () {
var oldValue = localStorage.getItem("simple_loop_" + location.href);
var input = prompt("Time range: start,end", oldValue || "");
var times = input.split(",");
localStorage.setItem("simple_loop_" + location.href, input);
if (times.length !== 2) {
alert('Invalid format. Please check your input');
return;
}
var startTime = parseInt(times[0]);
var endTime = parseInt(times[1]);
function simpleLoop(startTime, endTime) {
console.log('-- Run here');
var ytplayer = document.getElementById("movie_player");
var currentTime = ytplayer.getCurrentTime();
var suitableTimeout = endTime - startTime;
if (currentTime <= startTime || currentTime > endTime) {
ytplayer.seekTo(startTime);
} else {
suitableTimeout = endTime - currentTime;
}
console.log('>> Start timeout after: ', suitableTimeout * 1000);
setTimeout(function () {
simpleLoop(startTime, endTime);
}, suitableTimeout * 1000);
}
simpleLoop(startTime, endTime);
}();
Mỗi khi sử dụng, bạn chỉ cần click vào bookmark, nhập thời gian muốn loop. Tớ có làm 1 video nhỏ để bạn xem trực quan hơn tại đây
Nếu bạn gặp lỗi trong quá trình sử dụng, hoặc thấy bài viết có gì sai sót, có điểm nào chưa tối ưu, hãy comment cho tớ biết nhé ^^
Bài này nằm trong loạt bài chuẩn kiến thức để đi thi web mobile specialist của Google. Một số cách validate bằng HTML, sử dụng API kết hợp với javascript để custom lại theo ý muốn
Chúng ta cùng điểm qua các attribute mà HTML5 cung cấp để validate
type
Ngoài giá trị text, chúng ta sẽ có thêm
email: chỉ cho phép nhập địa chỉ email
number: chỉ cho phép nhập số
url: chỉ cho phép nhập dạng đường dẫn url
tel: không nên xài, vì mỗi nước của một kiểu format số điện thoại riêng
Truyền vào một regular expression, chỉ có trên <input/>, không sử dụng được với <textarea/>
<form>
<label for="choose">Bạn chỉ có thể nhập "cherry" hoặc "banana"</label>
<input id="choose" name="i_like" required pattern="banana|cherry">
<button>Gửi</button>
</form>
Sử dụng title để hiển thị một tooltip cho user biết chúng ta muốn user nhập vào giá trị gì
<input
type="text"
name="phone"
pattern="(\+84|0)\d{9,10}"
title="Nhập số điện thoại từ 10 đến 11 số"
/>
Customize câu hiển thị lỗi
Khi element invalid, nó sẽ hiện một câu thông báo kèm theo trên element, cái này phụ thuộc vào từng trình duyệt, không thể chỉnh lại bằng CSS, trình duyệt đang set ngôn ngữ gì thì nó hiển thị câu lỗi bằng ngôn ngữ đó, không đi theo ngôn ngữ khai báo của trang web.
Để thay đổi nội dung của câu thông báo, chúng ta buộc phải dùng javascript
Khá nhiều trình duyệt hiện tại cung cấp API để làm việc với validation, để đối phó với các trình duyệt cũ thì tất nhiên chúng ta dùng đến polyfill như Hyperform
Chúng ta khai báo novalidate để tắt validate của trình duyệt.
Javascript sử dụng API của trình duyệt để tương tác với validate của HTML5
var form = document.getElementsByTagName('form')[0];
var email = document.getElementById('mail');
var error = document.querySelector('.error');
email.addEventListener("input", function (event) {
// kiểm tra khi user bắt đầu nhập
if (email.validity.valid) {
// nếu valid, remove
error.innerHTML = "";
error.className = "error";
}
}, false);
form.addEventListener("submit", function (event) {
// kiểm tra khi user click submit.
if (!email.validity.valid) {
error.innerHTML = "Baby à, cho anh địa chỉ email chứ";
error.className = "error active";
// chặn việc submit form
event.preventDefault();
}
}, false);
Trong cuốn sách mới nhất của mình mang tên The Future Leader dành cho người làm nhân sự nói chung, Jacob Morgan – một tác giả đồng thời là một diễn giả nổi tiếng đã có những chia sẻ:
“Một cuộc nghiên cứu nhỏ của tôi đã diễn ra với hơn 140 CEO trên toàn thế giới từ các tập đoàn, công ty như Audi, MasterCard, Unilever, Best Buy, Oracle, Kaiser, Verizon,…. Tôi khảo sát ở họ về sự xem xét những tố chất cần thiết để có thể trở thành một nhà lãnh đạo tài năng trong tương lai. Một trong những câu hỏi tôi đã hỏi tất cả các CEO này là theo họ, những xu hướng phát triển nào giúp định hình những nhà lãnh đạo về nhân sự.”
Đây là 6 xu hướng xác định những gì sẽ đóng vai trò chính trong việc định hình các nhà lãnh đạo tương lai trong thập kỷ tới và hơn thế nữa. Bài viết dưới đây nhằm mục đích phân tích để bạn có cái nhìn sâu sắc hơn về 6 xu hướng này.
AI – Trí tuệ nhân tạo và phát triển công nghệ
Như chúng ta biết, công nghệ đang phát triển với một tốc độ ngoạn mục. Cùng với nó là AI – Trí tuệ nhân tạo lại có sức mạnh biến đổi hoàn toàn cách thức hoạt động của doanh nghiệp và con người. Do đó, không có gì quá ngạc nhiên khi hầu hết các CEO đều cho rằng sự phát triển về AI và công nghệ là xu hướng phổ biến nhất, có tác động mạnh mẽ đến việc định hình những nhà lãnh đạo tương lai.
Tuy nhiên, để thực hiện và có hướng phát triển đúng theo xu hướng này, các nhà quản lý nhân sự nên có sự triển khai và vận hành phù hợp. Đồng thời phải có niềm tin vào AI, tránh sự sợ hãi khi nghĩ rằng một ngày nào đó nó có thể thay thế hoàn toàn con người trong công việc. Bản thân các nhà lãnh đạo tương lai cần phải thành thạo về AI và sẵn sàng trải nghiệm việc áp dụng các công nghệ mới vào quy trình hợp thức hóa mô hình nhân sự của họ trước khi giúp các nhân viên hiểu được tác động tiềm năng của xu hướng này.
Chúng tôi sẽ thành công trong kỷ nguyên công nghệ số chỉ khi chúng tôi tham gia nhiệt tình và khuyến khích những sáng kiến, ý tưởng mới từ bản thân mình và cả những nhân viên về các vấn đề có liên quan. Tiếp cận AI và các công cụ công nghệ để phân tích nguồn dữ liệu là chuyện không của riêng ai.
“Lột xác” trong chiến lược & tiến trình thay đổi
Bên cạnh sự phát triển của AI và công nghệ chính là tốc độ thay đổi chung. Điều một nhà lãnh đạo tương lai cần làm chính là “lột xác” sao cho phù hợp trong tiến trình thay đổi đó.
Để thành công, các nhà quản lý nhân sự tiềm năng cần nắm bắt nhiều vấn đề hơn về những cách thức tổ chức, vận hành hiện đại hóa hơn, vấn đề đa dạng công nghệ và toàn cầu hóa ngành nhân sự,.. thay vì chỉ tập trung vào một chuyên môn nhất định. Liên tục mong đợi và phải biết tự tạo cơ hội, thời cơ cho bản thân thay vì trốn tránh hoặc ngại đối diện với những thách thức mới trong tiến trình thay đổi. Ngoài ra, các nhà lãnh đạo tương lai cần phải nhanh nhẹn, dễ thích nghi và thoải mái với một môi trường nhiều tài năng về nhân sự.
Hiểu về mục đích và ý nghĩa
Xu hướng tìm việc với những kỳ vọng về một mức lương cao dường như đã quá cũ so với hiện tại. Vì thực tế trong ngành nhân sự hiện nay, nhân viên họ mong muốn làm việc cho một tổ chức cho họ nhận thấy được mục đích và ý nghĩa của công việc mình đang làm vì nó là những thứ có thể định hướng lâu dài trong sự nghiệp của họ; lương thật sự quan trọng nhưng để giảm cạnh tranh và thu hút nhân tài thì lương chưa thật sự là bước đi chính xác.
Mục đích là lý do cho sự tồn tại của một tổ chức và thường bao gồm những thứ như đầu tư vào nhân viên, tạo sự khác biệt trên “sàn đấu” về nhân sự hoặc thúc đẩy sự đổi mới. Trong khi đó, ý nghĩa là tác động cá nhân trong công việc của mỗi nhân viên. Nhân viên luôn muốn thấy rằng những nỗ lực của họ có ảnh hưởng và tạo ra giá trị gì có thể đóng góp vào sự phát triển chung của công ty. Vì thế, để rèn luyện và phát huy tố chất của mình, các nhà lãnh đạo trước tiên phải hiểu công việc, mục đích, tác động và ý nghĩa của chính họ trước khi giúp nhân viên của họ nhận ra điều tương tự. Họ cần khai thác nhân viên của mình để hiểu được điều gì ở nhân viên họ cần phải thúc đẩy, tạo động lực.
Bối cảnh phát triển tài năng mới
Những năm gần đây đã mang lại sự thay đổi lớn về bối cảnh phát triển tài năng nói chung và dường như nó chỉ mới bắt đầu.
Khi các nhân viên lớn tuổi nghỉ hưu và các thế hệ trẻ gia nhập lực lượng lao động nhân sự, nhiều công ty thấy việc “săn lùng” và đào tạo các nhân viên lành nghề là điều rất thiết yếu. Đồng thời, sự đa dạng và hòa nhập đang trở nên quan trọng hơn.
Bối cảnh tài năng mới không chỉ là thay đổi về nhân khẩu học; đó là một cách tiếp cận mới để thu hút và giữ chân nhân tài. Không những thế, tìm kiếm và tuyển chọn ra thế hệ nhân viên tài năng còn nhằm mục đích đào tạo và nâng cao chất lượng chuyên môn nhân sự của họ để sẵn sàng chuẩn bị cho công việc tương lai. Các nhà lãnh đạo của tương lai nên cố gắng phát triển các nhóm nhân viên đa dạng, cần đầu tư vào nguồn nhân lực trẻ, tạo ra một môi trường phù hợp để họ phát huy tính sáng tạo, tư duy đổi mới của mình.
Đạo đức và tính minh bạch
Đạo đức và tính minh bạch được xem là là 2 yếu tố cần thiết để giúp bạn trở thành một nhà lãnh đạo tài năng. Việc tự thúc đẩy những phẩm chất này cũng chính là cách các nhà lãnh đạo rèn luyện cho mình sự chân thật và tính khiêm tốn. Các công ty có nền tảng về việc bồi dưỡng đạo đức tốt sẽ tạo được niềm tin giúp các nhân viên có thể đồng hành lâu dài. Đó cũng là lý do tại sao các nhà lãnh đạo nên tập trung vào vấn đề tổ chức xây dựng những chương trình, khóa học về rèn luyện kỹ năng sống cho nhân viên.
Bên cạnh đó, một nhà lãnh đạo tương lai cần có sự cởi mở, trung thực và tính minh bạch trong công việc và cách hành xử với nhân viên của mình. Hãy đánh giá một cách khách quan năng lực của nhân viên, cho họ những lời khuyên để họ nhận ra sự thiếu sót và khắc phục bản thân. Các nhà lãnh đạo cũng cần giữ vững lập trường của mình trong mọi chuyện, tránh cho nhân viên thấy rằng lãnh đạo của họ là một người cảm tính, dễ dàng thay đổi và không có sự kiên định.
Vấn đề toàn cầu hóa
Khi công nghệ số phát triển, thế giới nhân sự có nhiều vấn đề phát sinh hơn. Đó là thách thức về toàn cầu hóa. Không thể phủ nhận, toàn cầu hóa mang đến cho chúng ta những cơ hội tuyệt vời để hợp tác với các tổ chức đầu ngành thông qua mạng lưới phát triển; tạo ra sự kết nối và chia sẻ văn hóa giữa các doanh nghiệp. Thế nhưng, việc nắm bắt được chính xác những chuyển biến trong xu thế toàn cầu hóa là điều khó khăn. Vì vậy, không còn cách nào khác là các nhà lãnh đạo nhân sự bắt buộc phải học hỏi và tiếp thu để trở thành những công dân toàn cầu, những người đánh giá cao các nền văn hóa khác nhau và biết cách giao tiếp qua các rào cản về văn hóa và ngôn ngữ. Việc quan tâm đến vấn đề toàn cầu, hiểu về cơ hội, thách thức và những gì đang diễn ra trên trong thế giới nhân sự là bước đi đầu trên hành trình trở thành nhà lãnh đạo tương lai.
Lời kết
Nếu mong muốn tiến xa trong tương lai, những nhà lãnh đạo của hiện tại với chuyên môn và các tố chất sẵn có cần cần hiểu được xu hướng và điều chỉnh phương pháp lãnh đạo của họ để thay đổi cách sống, suy nghĩ, làm việc. 6 xu hướng này có ý nghĩa quan trọng đối với việc thay đổi đồng thời tạo ra các nhà lãnh đạo tiềm năng trong tương lai.
Một khi chọn trở thành lập trình viên, bạn có rất nhiều lựa chọn: làm việc cho các công ty product để xây dựng sản phẩm nội bộ, hoặc các công ty outsourcing cho các sản phẩm của đối tác. Tuy nhiên có một thuật ngữ mặc dù đã quen với các bạn đã đi làm nhưng vẫn khá lạ so với đại đa số người mới. Đó là: Onsite
Onsite là gì?
Onsite là làm việc cho khách hàng – thay vì làm việc cho doanh nghiệp đã ký hợp đồng ban đầu. Các bạn sẽ được thử thách tại các doanh nghiệp khác với các dự án lớn cần nhiều người tham gia. Điều kiện ở đây là lập trình viên phải có kinh nghiệm hay ít nhất cũng biết những việc cơ bản mà không cần đào tạo thêm.
Ví dụ về Onsite
Chẳng hạn khi Công Ty KMS triển khai một dự án với quy mô lớn, họ sẽ tuyển thêm nhiều lập trình viên từ các công ty cho thuê coder nhằm đảm bảo tiến độ dự án, tiết kiệm chi phí và nhân lực.
Các công ty hoặc tập đoàn nước ngoài sẽ có nhu cầu rất nhiều trong việc thuê onsite. Lập trình viên sẽ có cơ hội ra nước ngoài, tiếp xúc với những nền văn hóa mới và phương thức làm việc cũng khác. Thường thì các quốc gia đó sẽ là Singapore, Nhật Bản, Hàn Quốc, Mỹ, …
Việc đi làm onsite là mơ ước của khá nhiều anh em lập trình, nhất là các bạn vừa ra trường, muốn khám phá thế giới đi làm như thế nào, tiếp xúc với môi trường chuyên nghiệp hay văn hóa của một doanh nghiệp nào đó.
Onsite được gì?
Kiến thức: Dân IT đi onsite luôn được trang bị những kiến thức cơ bản nhất nhằm phục vụ cho dự án mới. Bạn sẽ nhận rất nhiều kiến thức khi tham gia một dự án lớn với quy mô hàng trăm, hàng ngàn người. Vậy nên đó là thứ dễ nhận thấy nhất.
Kinh nghiệm: phải đối mặt và giải quyết những vấn đề chưa từng gặp phải, vấn đề hóc búa và phải giải quyết chúng một cách nhanh chóng cho kịp tiến độ, biết cách phòng tránh lỗi trong quá trình làm việc, biết cách fix lỗi và cho ra đời sản phẩm kịp tiến độ. Ngoài ra, kỹ năng mềm và cách thức giám sát, đôn đốc dự án là những gì bạn chẳng thể học được khi còn ngồi trên ghế nhà trường.
Môi trường mới: anh em lập trình viên sẽ được làm quen với những con người mới, cách làm việc mới, văn hóa doanh nghiệp mới… tạo cho bạn những thói quen mới chuyên nghiệp hơn.
Ngôn ngữ mới: Cho dù bạn onsite trong nước hay nước ngoài thì ngoại ngữ là thứ bạn rất cần trau dồi thêm để công việc thêm thuận tiện hơn. Sẽ có những lúc bạn bơ vơ tại xứ người, không có một người bạn nào ở bên bạn sẽ nhận ra tầm quan trọng của ngoại ngữ. Trong công việc cũng vậy, bạn giao tiếp được, hiểu được ý định thì sẽ code nhanh hơn so với nhờ phiên dịch.
Cơ hội thăng tiến: Hãy tận dụng khoảng thời gian này để hoàn thiện bản thân, tích lũy những kinh nghiệm dù là nhỏ nhặt nhất. Với những kinh nghiệm hay phong cách làm việc chuyên nghiệp khi tiếp xúc với đối tác lớn, bạn sẽ dễ dàng thăng tiến một cách nhanh chóng.
Vậy Onsite mất gì?
Mối quan hệ: liên tục thay đổi đồng nghiệp, môi trường, nơi ở.
Thời gian: Để kịp tiến độ, bạn sẽ phải hoàn thành nhiều việc một lúc, OT ngày đêm và chẳng còn thời gian cho bản thân, cho gia đình.
Quyền lợi: Đó là các phúc lợi như team building, các lớp học thêm hay lâu lâu không được tính lương OT cũng là những khó khăn cần vượt qua.
Kết luận
Tất nhiên, cái gì cũng có hai mặt của nó. Onsite là cơ hội cho bạn được rất nhiều về kiến thức và kinh nghiệm cũng như thực hành những kĩ năng mềm tốt nhất. Đó là thực hành cách giao tiếp với những con người hoàn toàn xa lạ, cách đàm phán mang lại hiệu quả cho bạn, là cách sắp xếp quản lý thời gian để bạn tránh bị cuốn vào mớ task hỗn độn. Nếu như may mắn thì rất có thể bạn được cử đi làm onsite tại nước ngoài vì vậy việc trau dồi ngoại ngữ cho mình là điều cực kỳ tốt.
Bạn sẽ tiết kiệm được một khoản nho nhỏ từ khoản tiền đi làm onsite, cho những kế hoạch học tập, mua sắm, du lịch của bạn hay cũng có thể là mở công ty startup.
Cái mất của đi làm onsite cũng có những hạn chế nhất định khi đi onsite bạn chính là bộ mặt của công ty làm việc trực tiếp với khách hàng, điều đó cũng phần nào tạo nên áp lực đối với bạn. Bạn sẽ phải nỗ lực nhiều hơn, bắt nhịp nhanh hơn để làm tốt vai trò của mình nên nó cũng sẽ ngốn rất nhiều thời gian của mình. Tuy nhiên được lại nhiều hơn mất, còn trẻ thì ngại gì xông pha đúng không các bạn.
Trong bài viết trước, mình đã giới thiệu vài nét cơ bản về nghề lập trình website. Bài này chúng ta sẽ cùng cưỡi ngựa xem hoa, ngắm nhìn những vấn đề hóc búa trong nghề, qua những kinh nghiệm chia sẻ của những người đi trước cùng thông tin cập nhật thực tế trong cộng đồng. Hy vọng giúp ích cho các bạn mới tìm hiểu về nghề lập trình, cũng như đón nhận những góp ý thảo luận từ các bạn nhiều kinh nghiệm, nhằm chia sẻ bí quyết để tồn tại trong nghề, hạnh phúc với nghề và lên tới mức yêu nghề.
Tiền hay Đam Mê
Để theo đuổi mục tiêu nghề nghiệp đúng hướng, bạn cần xác định rõ ràng động lực chính của bản thân.
Ở đây chúng ta sẽ đi tìm lời giải đáp cho câu hỏi: “Bạn làm nghề lập trình vì đam mê hay kiếm tiền?”.
Tiền nong luôn là việc hệ trọng, làm gì hay ở đâu cũng vậy, muốn sống được thì phải có tiền trước đã, công việc lập trình có nhiều cách để kiếm tiền. Còn sở thích đam mê? Cũng quan trọng không kém, nhất là trong ngành Công nghệ thông tin (CNTT) với áp lực và thử thách cao độ.
Xin hãy thật sự nghiêm túc khi nhìn nhận vấn đề này, vì mỗi câu trả lời tuy của cá nhân, nhưng khi gộp lại theo cấp số nhân của hàng trăm người, của cả giới trẻ, hết thảy người lao động… Thì nó sẽ nói lên nhiều điều về vận mệnh của cả quốc gia.
Trong các diễn đàn khảo sát, mình thấy đa phần câu trả lời là tiền. Những bạn đồng nghiệp, bạn chung trường đại học của mình cũng sẵn sàng nhảy việc khi có mức lương cao hơn.
Thử hình dung khi tất cả chúng ta đều có mục đích lao động là tiền thì liệu mình có thể vượt qua được “lao động nước người ta” lao động vì đam mê?
Có ý kiến thông minh hơn, cho rằng cả hai Đam Mê và Tiền là mục tiêu chính trong công việc ta cần hướng tới, vì cả hai thứ tưởng chừng đối lập ấy lại gắn bó mật thiết vô cùng. Nếu bạn làm công việc yêu thích nhưng quá ít tiền, không đủ sống hay có lương cao nhưng công việc lại quá chán ngắt, cũng khó theo đuổi tới cũng.
Đó cũng là tiêu chí khi xem xét đầu quân vào công ty:
– Công ty A lương cao (điểm 10), công việc hơi tẻ nhạt (điểm 4)
– Công ty B lương vừa (điểm 7), công việc thú vị (điểm 8)
Bạn thông minh trên sẽ chọn công ty B, bạn mê tiền sẽ chọn công ty A.
Ý kiến của tác giả: chìa khóa để chọn Tiền hay Đam mê là Thời điểm.
Thời điểm mới ra trường: đam mê ưu tiên hơn, chấp nhận lương ít trong 1 năm đầu.
Thời điểm đã có 2-5 năm kinh nghiệm: ưu tiên kiếm tiền, xứng đáng công sức mình bỏ ra.
Thời điểm lâu dài hơn: ưu tiên lại đam mê, bạn không thể làm việc lớn nếu chỉ nghĩ tới tiền, tham gia khởi nghiệp thứ phải hy sinh đầu tiên chính là tiền đâu.
Ý kiến của 1 thanh niên giấu tên cho hay: “Bitch, shut up! Tao đi làm không vì tiền cũng không vì đam mê, anh đi làm vì cơ hội thăng tiến thì sao?”.
Vậy sau khi thăng tiến lên làm Leader chẳng hạn, lúc đó anh đòi lương cao hay là sự thích thú trong công việc? Chắc chắn anh sẽ phải chọn tiếp 1 trong 2 nhu cầu Tiền và Đam Mê, không tránh khỏi cho dù mục tiêu ngắn hạn của anh có là Cơ hội đi chăng nữa.
Ý kiến của các bậc vĩ nhân:
Bill Gates
Ta làm việc vì tiền, mọi thứ tuyệt vời nhất, phần mềm, hợp đồng kinh doanh… Đều vì mục đích tiền. Đam mê của ta là đam mê tiền, động lực vì tiền của ta gắn thêm động cơ đam mê nữa nên chạy với vận tốc ánh sáng.
Steve Jobs
Ta làm vì đam mê, ta chưa bao giờ thèm để tâm tới tiền bạc cả. Vì thế trong những hoàn cảnh vô cùng cơ cực, ta vẫn viết lên lịch sử nhờ sự đam mê. Tiền cũng được mà đam mê cũng được, miễn sao những động lực này đủ mạnh mẽ để tiếp sức cho bạn hằng ngày, vượt qua mọi khó khăn trong công việc. Còn hơn 1 anh thiếu động lực thì mới bị sếp nhắc nhở, đồng nghiệp lớn tiếng mà đã vội viết thư nghỉ việc.
Chuyện chất xám
Lại thêm một chủ đề đáng quan tâm trong nghề lập trình mà được các bạn tranh luận vô cùng sôi nổi. Khi Việt Nam đang dần trở thành cái xưởng gia công phần mềm của thế giới, tới mức đứng top 6. Người thì lạc quan vì chúng ta tăng tỉ lệ lao động kỹ thuật cao, kẻ thì chua xót vì chúng ta xứng đáng được hơn thế, trí tuệ Việt trước giờ luôn được thế giới khâm phục.
Qua bài viết Đầu quân công ty Outsourcing, Product hay Startup, bạn sẽ hiểu thêm về các dạng công ty phần mềm hiện nay. Tuy nhiên chọn như thế nào? Bạn có cho rằng làm việc cho công ty gia công (outsourcing) của nước ngoài là đang “bán rẻ rúng” sức lao động? Vậy nên bạn ráng học tiếng anh và xin ra nước ngoài làm luôn mới là bán sức lao động “đúng giá”? Hay là vào làm cho công ty nhà nước để cống hiến tuổi trẻ và nhiệt huyết miễn phí? Hay làm khởi nghiệp để được bán sức cho dân ta tình thương mến thương?
Với các bạn chuẩn bị ra trường không nên phân vân những điều này vội. Thật ra sức lao động hay chất xám gì đó, nó có giá trị khi được liên tục mài giũa và tôi luyện, thông qua công việc, kinh nghiệm, học hỏi. Ví dụ anh Tèo làm việc kinh nghiệm 10 năm thì lương cao hơn anh Tí mới ra trường, chứ có biết anh Tèo bán chất xám ở chợ đầu mối nào đâu. Vậy nên, hiện tại bạn chỉ cần tìm 1 môi trường thích hợp, có thật nhiều động lực, và làm việc thật chăm chỉ. Chuyện bán chất xám cho ai không quan trọng bằng bán mà không ai thèm mua.
Tuổi nghề lập trình
Làm lập trình viên dễ xin việc, lương cao thì ai cũng biết, nhưng chuyện tuổi nghề của lập trình viên ngắn thì không phải ai cũng nhận thấy. Lập trình là công việc đòi hỏi sự tập trung, óc nhanh nhạy, do đó tuổi đời càng trẻ trung năng động càng tốt, đây cũng là một đặc tính khá bạc bẽo của nghề mà bạn nên chấp nhận. Nếu như các ngành nghề khác như Bác sĩ, Giáo viên, Luật sư… Càng làm lâu năm bạn càng nhiều kinh nghiệm và càng được có vai vế trong nghề, nhưng với lập trình, kinh nghiệm sẽ mau chóng lạc hậu, chỉ có sự học hỏi nhanh, nắm bắt công nghệ mới là yếu tố quyết định.
Tuy nhiên, ngành CNTT rất rộng, bạn vẫn có thể chuyển từ công việc lập trình sang các công việc khác ưu tiên kinh nghiệm hơn như: phân tích thiết kế, xây dựng kiến trúc hệ thống, chuyên gia kỹ thuật, quản lý dự án…Nếu có năng lực, các bạn có thể làm CNTT cả đời.
Kết thúc
Trong đầy rẫy những bài viết miêu tả nghề lập trình trên mạng do cánh nhà văn, nhà thơ theo trường phái lãng mạng viết, mình nửa đêm vỗ gối, nước mắt đầm đìa, ngồi cong đít viết lên bài này, góp nhặt những vấn đề chua cay trong ngành lập trình phần mềm, hy vọng có một cái nhìn thực tế hơn dành cho những ai thật sự quan tâm và muốn theo đuổi con đường lập trình, mong đón nhận được ý kiến độc giả dưới phần bình luận để góp phần giúp bài viết được đầy đủ hơn.
Elasticsearch là gì? – là một công cụ tìm kiếm dựa trên nền tảng Apache Lucene. Nó cung cấp một bộ máy tìm kiếm dạng phân tán, có đầy đủ công cụ với một giao diện web HTTP có hỗ trợ dữ liệu JSON.
Elasticsearch được phát triển bằng Java và được phát hành dạng nguồn mở theo giấy phép Apache.
Chi tiết về Elasticsearch là gì? (ES)
Elasticsearch là một search engine.
Elasticsearch được kế thừa từ Lucene Apache
Elasticsearch thực chất hoặt động như 1 web server, có khả năng tìm kiếm nhanh chóng (near realtime) thông qua giao thức RESTful
Elasticsearch có khả năng phân tích và thống kê dữ liệu
Elasticsearch chạy trên server riêng và đồng thời giao tiếp thông qua RESTful do vậy nên nó không phụ thuộc vào client viết bằng gì hay hệ thống hiện tại của bạn viết bằng gì. Nên việc tích hợp nó vào hệ thống bạn là dễ dàng, bạn chỉ cần gửi request http lên là nó trả về kết quả.
Elasticsearch là 1 hệ thống phân tán và có khả năng mở rộng tuyệt vời (horizontal scalability). Lắp thêm node cho nó là nó tự động auto mở rộng cho bạn.
Elasticsearch là 1 open source được phát triển bằng Java
Các công ty lớn đang sử dụng
Wikimedia
athenahealth
Adobe Systems
Facebook
StumbleUpon Mozilla,
Amadeus IT Group
Quora
Foursquare
Etsy
SoundCloud
GitHub
FDA
CERN
Stack Exchange
Center for Open Science
Reverb
Netflix
Pixabay
Motili
Sophos
Slurm Workload Manager
Elasticsearch hoạt động như thế nào?
Sau khái niệm Elasticsearch là gì, thì chúng ta lại tiếp tục tìm hiểu hoạt đông của Elasticsearch, đó là 1 server riêng biệt để “phục vụ” việc tìm kiếm dữ liệu. ES sẽ chạy một cổng (dưới local default là 9200). Người ta cũng có thể dùng ES là DB chính nhưng thường không ai làm thế vì cái gì cũng có nhiệm vụ riêng biệt của nó.
ES không mạnh trong các thao tác CRUD, nên thường sẽ dùng song song với 1 DB chính (SQL, MySQL, MongoDB …)
Tại sao nên sử dụng Elasticsearch?
Tại sao phải dùng ES trong khi tìm kiếm văn bản có thể sử dụng câu lệnh LIKE SQL cũng được?
Nếu search bằng truy vấn LIKE “%one%” thì kết quả sẽ chỉ cần chứa “one” là ra. Ví dụ: “phone”, “zone”, “money”, “alone” … nói chung sẽ là 1 list kết quả không mong muốn.
Còn search bằng ES thì gõ “one” sẽ chỉ có “one” được trả về mà thôi. Truy vấn LIKE không thể truy vấn từ có dấu. Ví dụ: từ khoá có dấu là “có”, nếu truy vấn LIKE chỉ gõ “co” thì sẽ không trả về được chính xác kết quả Về Perfomance thì ES sẽ là tốt hơn, truy vấn LIKE sẽ tìm kiếm đơn thuần toàn văn bản không sử dụng index, nghĩa là tập dữ liệu càng lớn thì tìm kiếm càng lâu, trong khi ES lại “đánh index” cho các trường được chọn để tìm kiếm.
Document là một JSON object với một số dữ liệu. Đây là basic information unit trong ES. Hiểu 1 cách cơ bản thì đây là đơn vị nhỏ nhất để lưu trữ dữ liệu trong Elasticsearch.
2. Index
Index có lẽ là một khái niệm quá quen thuộc đối với các anh em dùng Mysql rồi. Tuy nhiên index trong ES hoàn toàn khác trong Mysql.
Trong Elasticsearch , sử dụng một cấu trúc được gọi là inverted index . Nó được thiết kế để cho phép tìm kiếm full-text search. Cách thức của nó khá đơn giản, các văn bản được phân tách ra thành từng từ có nghĩa sau đó sẽ đk map xem thuộc văn bản nào. Khi search tùy thuộc vào loại search sẽ đưa ra kết quả cụ thể.
VÍ dụ : Chúng ta có 2 văn bản cụ thể như sau :
1,The quick brown fox jumped over the lazy dog
2,Quick brown foxes leap over lazy dogs in summer
Để tạo ra một inverted index, trước hết chúng ta sẽ phân chia nội dung của từng tài liệu thành các từ riêng biệt (chúng tôi gọi là terms), tạo một danh sách được sắp xếp của tất cả terms duy nhất, sau đó liệt kê tài liệu nào mà mỗi thuật ngữ xuất hiện. Kết quả như sau:
Term Doc_1 Doc_2
-------------------------
Quick | | X
The | X |
brown | X | X
dog | X |
dogs | | X
fox | X |
foxes | | X
in | | X
jumped | X |
lazy | X | X
leap | | X
over | X | X
quick | X |
summer | | X
the | X |
------------------------
Bây giờ, nếu chúng ta muốn tìm kiếm màu quick brown, chúng ta chỉ cần tìm trong các tài liệu trong đó mỗi thuật ngữ có xuất xuất hiện hay không. Kết quả như sau:
Term Doc_1 Doc_2
-------------------------
brown | X | X
quick | X |
------------------------
Total | 2 | 1
Như các bạn đã thấy, cả 2 đoạn văn bản đều thích hợp với từ khóa. Tuy nhiên có thể dễ dàng nhận ra rằng Doc_1 chính xác hơn nhiều.
Shard là đối tượng của Lucene , là tập con các documents của 1 Index. Một Index có thể được chia thành nhiều shard.
Mỗi node bao gồm nhiều Shard . Chính vì thế Shard mà là đối tượng nhỏ nhất, hoạt động ở mức thấp nhất, đóng vai trò lưu trữ dữ liệu.
Chúng ta gần như không bao giờ làm việc trực tiếp với các Shard vì Elasticsearch đã support toàn bộ việc giao tiếp cũng như tự động thay đổi các Shard khi cần thiết.
Có 2 loại Shard là : primary shard và replica shard.
3.1 : Primary Shard
Primary Shard là sẽ lưu trữ dữ liệu và đánh index . Sau khi đánh xong dữ liệu sẽ được vận chuyển tới các Replica Shard.
Mặc định của Elasticsearch là mỗi index sẽ có 5 Primary shard và với mỗiPrimary shard thì sẽ đi kèm với 1 Replica Shard.
3.2 : Replica Shard
Replica Shard đúng như cái tên của nó, nó là nơi lưu trữ dữ liệu nhân bản của Primary Shard
Replica Shard có vai trò đảm bảo tính toàn vẹn của dữ liệu khi Primary Shardxảy ra vấn đề.
Ngoài ra Replica Shard có thể giúp tăng cường tốc độ tìm kiếm vì chúng ta có thể setup lượng Replica Shard nhiều hơn mặc định của ES
Là trung tâm hoạt động của Elasticsearch. Là nơi lưu trữ dữ liễu ,tham gia thực hiện đánh index cúa cluster cũng như thực hiện các thao tác tìm kiếm
Mỗi node được định danh bằng 1 unique name
5. Cluster
Tập hợp các nodes hoạt động cùng với nhau, chia sẽ cùng thuộc tính cluster.name. Chính vì thế Cluster sẽ được xác định bằng 1 ‘unique name’. Việc định danh các cluster trùng tên sẽ gây nên lỗi cho các node vì vậy khi setup các bạn cần hết sức chú ý điểm này
Mỗi cluster có một node chính (master), được lựa chọn một cách tự động và có thể thay thế nếu sự cố xảy ra. Một cluster có thể gồm 1 hoặc nhiều nodes. Các nodes có thể hoạt động trên cùng 1 server .
Tuy nhiên trong thực tế , một cluster sẽ gồm nhiều nodes hoạt động trên các server khác nhau để đảm bảo nếu 1 server gặp sự cố thì server khác (node khác) có thể hoạt động đầy đủ chức năng so với khi có 2 servers. Các node có thể tìm thấy nhau để hoạt động trên cùng 1 cluster qua giao thức unicast.
Chức năng chính của Cluster đó chính là quyết định xem shards nào được phân bổ cho node nào và khi nào thì di chuyển các Cluster để cân bằng lại Cluster
Ưu nhược điểm của ES
Ưu điểm
Tìm kiếm dữ liệu rất nhanh chóng, mạnh mẽ dựa trên Apache Lucene ( near-realtime searching)
Có khả năng phân tích dữ liệu (Analysis data)
Khả năng mở rộng theo chiều ngang tuyệt “vòi”
Hỗ trợ tìm kiếm mờ (fuzzy), tức là từ khóa tìm kiếm có thể bị sai lỗi chính tả hay không đúng cú pháp thì vẫn có khả năng elasticsearch trả về kết quả tốt.
Hỗ trợ Structured Query DSL (Domain-Specific Language ), cung cấp việc đặc tả những câu truy vấn phức tạp một cách cụ thể và rõ ràng bằng JSON.
Hỗ trợ nhiều Elasticsearc client như Java, PhP, Javascript, Ruby, .NET, Python
Nhược điểm
Elasticsearch được thiết kế cho mục đích search, do vậy với những nhiệm vụ khác ngoài search như CRUD thì elastic kém thế hơn so với những database khác như Mongodb, Mysql …. Do vậy người ta ít khi dùng elasticsearch làm database chính, mà thường kết hợp nó với 1 database khác.
Trong elasticsearch không có khái niệm database transaction , tức là nó sẽ không đảm bảo được toàn vẹn dữ liệu trong các hoạt độngInsert, Update, Delete.Tức khi chúng ta thực hiện thay đổi nhiều bản ghi nếu xảy ra lỗi thì sẽ làm cho logic của mình bị sai hay dẫn tới mất mát dữ liệu. Đây cũng là 1 phần khiến elasticsearch không nên là database chính.
Không thích hợp với những hệ thống thường xuyên cập nhật dữ liệu. Sẽ rất tốn kém cho việc đánh index dữ liệu.
Cài đặt ElasticSearch
Yêu cầu
Elasticsearch yêu cầu Java 8 trở lên và phải thiết lập biến môi trường JAVA_HOME cho java, do đó trước khi cài Elasticsearch, hãy chắc chắn rằng bạn đã cài Java version >= 8 trên máy.
Kiểm tra bằng lệnh java -version để biết máy máy mình đã cài Java chưa và phiên bản Java đang cài là bao nhiêu. Kiểm tra biến môi trường JAVA_HOME đã được thiết lập chưa bằng lệnh: echo $JAVA_HOME
Cài đặt
Download và cài đặt Elasticsearch PGP Key bằng lệnh sau:
Lệnh thêm, sửa dữ liệu vào index trên(team), ở đây là dữ liệu do nhóm em fake ra và insert vào
$ curl -X PUT http://localhost:9200/team/member/_bulk?{"create"= { "_id": 1, "_type": "member"}&{"id"= "5510ce4ee174054836ef3c5a","name": "Vargas Rosa","email": "[email protected]","age": 25,"phone": "+1 (807) 530–3567","image": "http://api.randomuser.me/portraits/men/78.jpg","description": "enim Lorem upidatat et nostrud ut irure qui qui nulla qui deserunt fugiat laborum elit","technologies": "ios javascript python"}&{"create"= { "_id": 2, "_type": "member"}&{"id"= "5510ce4e24ecdab88fe18d06","name": "Navarro Thornton","email": "[email protected]","age": 34,"phone": "+1 (896) 579–3364","image": "http://api.randomuser.me/portraits/men/59.jpg","description": "sit enim velit cillum magna commodo tempor","technologies": "swift erlang java"}&{"create"= { "_id": 3, "_type": "member"}&{"id"= "5510ce4e6e7bbdbc120c9a89","name": "Francine Aguirre","email": "[email protected]","age": 30,"phone": "+1 (963) 492–3402","image": "http://api.randomuser.me/portraits/men/82.jpg","description": "cu et sit ullamco tempor Lorem excepteur magna pariatur","technologies": "javascript ionic ruby"}&{"create"= { "_id": 4, "_type": "member"}&{"id"= "5510ce4ebd2a509edd8c6b50","name": "Krystal Simmons","email": "[email protected]","age": 40,"phone": "+1 (857) 418–2040","image": "http://api.randomuser.me/portraits/women/10.jpg","description": "ea dolor ex proident eiusmod et ut irure esse","technologies": "ruby c c"}
Lệnh hiển thị thông tin các dữ liệu trong document và của từng doccument sau khi đã thêm
$ curl -X GET http://localhost:9200/team/member/4?pretty
Lệnh tìm kiếm tất cả dữ liệu các document trong index sử dụng API Search
$ curl -X GET http://localhost:9200/_search?pretty=true
Lệnh tìm kiếm theo text nhập ở tất cả các trường trong document , ở đây key search của mình là ruby, đây cũng chính là điểm mạnh của Elasticsearch, nó không giống với query like như thao tác với DB vì nó cần phải nhập đầy đủ text đó ví dụ như ruby ở trên sẽ trả về các document member có text là ruby trong tất cả các field
$ curl -X GET http://localhost:9200/_search?q=ruby
Vẫn còn một số các hoạt động, các API để xử lý vào thao tác với Index trong Elasticsearch, nhưng với phần tìm hiểu ở trên về một công cụ mạnh mẽ như elasticsearch là đủ để có thể thao tác, sử dụng và làm quen với elasticsearch. Các bạn có thể tham khảo ở các trang dưới đây.
Cái nhìn về unit test cho component, test cái gì, cái gì không test khi viết unit test
Khi viết unit test, mình thấy không cần bỏ ra quá nhiều thời gian để cover 100% các case sẽ có, nhưng vẫn đảm bảo đủ các trường hợp cần thiết. Vậy câu hỏi là: như thế nào là đủ? Đây là những quan điểm rất cá nhân, nếu bạn nào đã là master of unit test rồi thì mình hy vọng có được sử chỉ giáo.
Mình xem như bạn đã biết chút ít về Jest và Vue Test Utils, đã chạy vue-cli để setup một dự án mới với Jest
Khi chúng ta viết test cho một component, bắt đầu với những public interface của component đó. Đừng nghe đến chứ public interface mà rung sợ, nó chỉ là những gì component đó tương tác với thế giới bên ngoài. Nếu bạn viết hướng dẫn sử dụng để người khác xài component đó, bạn viết những gì, đó là những thứ bạn sẽ test, component nhận vào những gì và output ra những gì.
Đầu vào của component
props
tương tác của user, click, kéo-thả
store
route params Đầu ra của component
render ra DOM
tạo ra sự kiện nào đó
thay đổi route
cập nhập lại store
Khi tập trung vào những public interface này nghĩa là chúng ta cũng không tập trung vào logic bên trong của component, từng dòng code của component đó chạy ra sao. Nghe có vẻ không hợp lý, nhưng unit test chỉ tập trung vào kết quả trả về, không quan tâm làm thế nào để có kết quả đó.
Component <RandomNumberGenerator/> bên dưới, nó sinh ra trong cuộc đời này là để tạo một con số ngẫu nhiên nằm trong khoảng min và max. Trước khi tiếp tục, bạn có thể xác định được input và output của component này chưa?
Chúng ta không cần biết nó đã làm như thế nào, cách làm đó đúng hay sai chúng ta không phải là người đi kiểm tra, ví dụ như <RandomNumberGenerator/>, chúng ta đưa vào 2 input min và max, hàm sẽ thực hiện việc đó là
Tất cả những gì chúng ta cần đảm bảo là con số trả về nằm giữa 2 giá trị min và max, nếu sau này có cập nhập hay thay đổi cách hiện thực của hàm này, dùng thư viện khác để random, dùng cách khác để random, chúng ta không cần kiểm tra cách làm bên trong.
Ví dụ
Component TestComponent.vue bên dưới, nó có 3 dependency là Vuex ($store), Vue Router ($router) và Vue Auth ($auth)
Có ai đó vô tình đổi tên biến title thành name và quên mất cập nhập trong file template. Có vẻ là một tình huống rất cần để viết test đúng không? Nhưng viết thế nào, số lượng biến như vậy trong template là nhiều vô số kể, viết test từng biến một thì chắc hết cả tuổi thanh xuân.
Cách tốt nhất để test trong trường hợp trên là dùng snapshot test. Nó sẽ không chỉ kiểm tra title mà còn gồm luôn cả image, button text, class,…
Test case 2: router login được gọi khi click button mà chưa đăng nhập
test('TEST CASE 2: router login được gọi khi click button mà chưa đăng nhập', () => {
const config = createConfig()
const wrapper = shallowMount(Item, config)
wrapper.find('button').trigger('click')
/// thêm expect ở bên dưới
})
Mình sẽ không quan tâm, <Login.vue/> có được mount vào sau khi click hay không, chúng ta chỉ expect khi click $router sẽ push vào object { name: "login" }
Test case 3: vuex được gọi khi user đã đăng nhập và click button
Cũng tương tự như trên, chúng ta sẽ test mutation cập nhập đúng giá trị chúng ta mong muốn khi viết test cho store, còn ở component, chúng ta cần biết component có commit lên cho Vuex chưa
Sửa lại $auth.check thành true để giả lập đăng nhập thành công rồi, chúng ta kiểm tra phương thức commit của store
test('TEST CASE 3: vuex được gọi khi user đã đăng nhập và click button', () => {
const config = createConfig({
mocks: {
$auth: {
check: () => true
},
$store: {
state: [{ id: 2 }],
commit: jest.fn()
}
}
})
const wrapper = shallowMount(TestComponent, config)
wrapper.find('button').trigger('click')
const spy = jest.spyOn(config.mocks.$store, 'commit')
expect(spy).toHaveBeenCalled()
})
Toàn bộ file spec lúc này
import { shallowMount } from '@vue/test-utils'
import TestComponent from '@/components/TestComponent.vue'
function createConfig (overrides) {
const id = 1
const mocks = {
$auth: {
check: () => false
},
$router: {
push: jest.fn()
},
$store: {
state: [{ id }],
commit: jest.fn()
}
}
const propsData = { id }
return Object.assign({ mocks, propsData }, overrides)
}
describe('TestComponent', () => {
test('TEST CASE 1: Render HTML', () => {
const wrapper = shallowMount(TestComponent, createConfig())
expect(wrapper).toMatchSnapshot()
})
test('TEST CASE 2: router login được gọi khi click button mà chưa đăng nhập', () => {
const config = createConfig()
const wrapper = shallowMount(TestComponent, config)
wrapper.find('button').trigger('click')
const spy = jest.spyOn(config.mocks.$router, 'push')
expect(spy).toHaveBeenCalledWith({ name: 'login' })
})
test('TEST CASE 3: vuex được gọi khi user đã đăng nhập và click button', () => {
const config = createConfig({
mocks: {
$auth: {
check: () => true
},
$store: {
state: [{ id: 2 }],
commit: jest.fn()
}
}
})
const wrapper = shallowMount(TestComponent, config)
wrapper.find('button').trigger('click')
const spy = jest.spyOn(config.mocks.$store, 'commit')
expect(spy).toHaveBeenCalled()
})
})
Kết
Mindset khi chúng ta viết unit test component là: mọi unit test đều dư thừa, trừ khi bạn có lý do cho việc unit test đó
Các câu hỏi chúng ta đặt ra trước khi viết
Component sinh ra trên trái đất này để làm gì
Public interface của component là gì, input, output nó là gì
Đoạn test đó để kiểm tra code của mình, hay code của người ta?