Nếu lập trình đủ lâu, bạn sẽ ít nhiều nghe đến khái niệm mental model, và nếu bạn đã và đang viết React, bạn càng thấy thuật ngữ này xuất hiện rất nhiều. Đây là một khái niệm không chỉ trong hữu dụng trong React, mà nó còn là chìa khóa để bạn tự tin khi làm việc với những thư viện như React.
Mental model là gì
Một chữ rất khó tìm được một từ tiếng việt gói gọn để mô tả nó. Một cách dài dòng thì nó là cách mà chúng ta hình dung một vấn đề trong đầu, một bước mapping một hệ thống ở bên ngoài vào trong đầu trong ta, hình dung nó cách vận hành.
Một ví dụ điển hình của mental model là internet: một hệ thống phức tạp gồm nhiều phần kết nối lại với nhau, nhưng hãy nghĩ đến cái mà bạn hình dung về nó. Tôi sẽ nghĩ nó là một hệ thống các máy tính kết nối lẫn nhau thông qua rất nhiều server, một vài điều hướng viên giúp định hướng đường đi của thông tin.
Nó không phải là một hệ thống mô tả đầy đủ chi tiết về internet, nhưng ít nhất với cái hình dung này, tôi có thể xử lý nhiều thứ liên quan, thí dụ như nếu tôi cần mạng thì tôi cần có máy tính thiết bị đầu cuối và nối vào một đường truyền của nhà mạng.
Nếu chúng ta hình dung được mọi thứ sẽ vận hành ra làm sao, nếu gặp một vấn đề, chúng ta có thể làm việc với nó trơn tru hơn.
Hình dung cách React vận hành như thế nào
React giúp chúng ta xây dựng nhưng hệ thống UI phức tạp, với tùm lum thứ tương tác qua lại với nhau dễ dàng hơn trước đây rất nhiều. Nó cũng định hướng chúng ta viết code theo một cách rất cụ thể, giống như nó thể thơ “lục bát”, khi bạn viết thì phải tuân thủ những nguyên tắc nhất định.
Ý tưởng chính của React: đóng gói những logic và UI giống nhau của ứng dụng thành một khối, React đảm bảo phần đóng gói này luôn cập nhập.
Tất cả đều là function
React component: là một function
Một component chứa một component khác: một function gọi đến một function khác
Prop: tham số của một function
Khi viết bằng JSX, bạn có thể tưởng nhầm component, prop là gì đó cao siêu. Nếu bỏ hết những gì của JSX đi, React là những function gọi qua gọi lại.
Component: một function trả về JSX
React sử dụng JSX – Javascript XML – một cách viết nhét HTML vào trong javascript.
Hãy bỏ qua class component và chỉ tập trung vào functional component đang trở nên phổ biến hơn. Một function component sẽ hoạt động y như một javascript function thông thường. React component luôn trả về JSX -> sau đó sẽ được thực thi và trả về kết quả cuối cùng là HTML
const Li = (props) => <li {...props}>{props.children}</li>;
export const RickRoll = () => (
<div>
<div className="wrapper">
<ul>
<Li color={"red"}>Never give you up</Li>
</ul>
</div>
</div>
);
Trong React, cũng như trong HTML và đời sống, con thì chỉ có một mẹ, không đứa con nào của thể do 2 người mẹ sinh ra, mỗi component cũng chỉ có một mẹ, component mẹ thì có thể có nhiều con.
Prop: tham số của function
Prop (properties) chẳng qua là một cách gọi khác cho tham số truyền vào trong function, còn về mọi thứ còn lại nó hoàn toàn giống nhau, React có nhét thêm một số tham số của riêng nó như children.
Hình dung về một function
Bạn có thể hình dung function/component như những chiếc hộp, thằng này bọc thằng kia
Những chiếc hộp này tương tác với nhau như thế nào?
Bạn có thể hình dung trong đời sống thực ông bà có câu nói tài sản của cha/mẹ là của con, tài sản của con là của con, Javascript người ta đặt tên cho kiểu kế thừa đó gọi là closure.
Đây là cách mà các function cha-con tương tác với nhau, bạn sử dụng function, bạn đã sử dụng closure.
Nghĩa là trong React, là cha mẹ chúng ta có thể truyền prop xuống cho con, nhưng tài sản của con thì chúng ta không đụng vào được
Render có thể xem là phần gây khó dễ nhất của React để mà hình dung. Có những thứ nhìn vào code chúng ta sẽ không thấy được cơ chế khi render chuyện gì xảy ra và không xảy ra.
Tưởng tượng nó như một cái hộp có thể tái chế, lần render đầu tiền là lúc sản xuất ra chiếc hộp này, các lần re-render tiếp theo, hay tái chế, phần lớn mọi thứ sẽ được đập đi làm lại, nhưng những phần như state sẽ được tái sử dụng
Đã 10 năm kể từ khi mình chính thức trở thành 1 lập trình viên. Rất khó để nhớ về khoảng thời gian mà mình còn chưa biết HTML là gì. Đa số tụi nhỏ thường chọn múa ballet hay chơi loại nhạc cụ nào đó, riêng mình lại chọn đắm chìm trong những dòng code. Nhớ lại lúc mình mới bắt đầu được nhận thù lao thường xuyên chỉ để gõ những ‘ký hiệu lạ lẫm’ vào Terminal, mình cũng muốn chia sẻ 1 chút về những thay đổi về cách suy nghĩ của bản thân trong nhiều năm qua với vai trò là 1 lập trình viên. Với các bạn junior: Có thể bạn sẽ tìm thấy thứ gì đó để rút kinh nghiệm, cũng có thể tìm thấy cảm hứng để tiếp tục con đường developer. Hoặc có thể bạn sẽ thấy bài đăng này rất đáng khích lệ vì bạn đã vượt xa level của mình rồi. Với các senior: Có thể bạn sẽ thấy điểm tương đồng, hay bắt gặp vài tình huống dở khóc dở cười mà chính bạn cũng từng gặp khi còn là junior. Sau đây là 9 điều mình đúc kết được từ khi còn là junior.
Mình là 1 lập trình viên senior
Mình ứng tuyển cho công việc đầu tiên lúc mới 19 tuổi. Vị trí mình ứng tuyển là ‘Quản trị web sinh viên – Student Webmaster’. Vốn là 1 công việc khá xịn sò, bởi vì bạn sẽ vừa là sinh viên và còn là quản trị viên cùng 1 lúc. Giờ thì mọi người đều muốn được gọi là ‘kỹ sư’ vì nghe có vẻ hào nhoáng hơn, nhưng nếu bạn hỏi mình thì từ ‘quản trị viên’ sẽ chính xác hơn. Anyway, công việc của mình là viết PHP và MySQL, duy trì website Drupal cũng như dựng các bộ tool nội bộ. Vì đã code tại nhà được vài năm, mình khá chắc khoảng thời gian đó cũng được xem như là ‘số năm kinh nghiệm’. Nên khi được hỏi về số năm kinh nghiệm về PHP, mình tự tin trả lời rằng: “3 – 4 năm!” Mình cũng nghĩ là bản thân biết khá nhiều về SQL bởi vì mình có thể làm được outer joins. Và theo Google, 3-4 năm kinh nghiệm có nghĩa là mình nên đi kiếm tiền được rồi. Nói qua về công việc hiện tại, mình được tuyển sau 5 năm học hỏi ở trường cũng như qua kinh nghiệm chuyên ngành (vốn mình từng nghĩ kinh nghiệm nào cũng giống nhau như cả thôi). Và ở thời điểm đó, mình cơ bản không bao giờ review code. Mình deploy ssh-ing vào 1 server và chạy ‘git pull’. Mình còn chưa phải open 1 Pull Request. Mình đã học được nhiều thứ tuyệt vời với 2 công việc đầu tiên, nhưng chưa bao giờ có cơ hội để làm cùng với các dev khác trong cùng 1 codebase. Tuy vậy, mình đã thử ứng tuyển cho vị trí ‘senior frontend engineer’, và đã được nhận việc.
Và thế là, mình đã trở thành 1 lập trình viên senior ở độ tuổi 24.
Rõ ràng là nhà tuyển dụng sẽ không để mình đảm nhiệm “chức danh” này nếu mình không thực sự là 1 senior. Và thế là mình trở thành lập trình viên trẻ tuổi nhất tại văn phòng làm việc.
Không phải tất cả các kinh nghiệm đều giống như nhau. Kinh nghiệm coding từ nhỏ, làm việc thời sinh viên, làm về nghiên cứu CS, và làm việc tại 1 startup đang phát triển đều là những dạng kinh nghiệm đáng giá. Nhưng chúng không hề giống nhau. Giai đoạn đầu trong sự nghiệp, bạn có thể học được gấp 10 lần (ở 1 team hỗ trợ lẫn nhau trong 1 năm) hơn là chỉ viết code 1 mình (hay với feedback) trong 5 năm trời. Nếu code của bạn chưa từng được các lập trình viên khác review, thì bạn sẽ không học được nhanh hết sức có thể – đó là 1 yếu tố khá quan trọng. Đó là lý do các cố vấn viên – mentor rất là quan trọng, và có 1 team làm việc cùng cũng đáng giá hơn nhiều so với việc kiếm được vài đồng trong ví. Đừng chấp nhận vị trí junior ở nơi mà bạn sẽ phải làm việc 1 mình! Và đừng chấp nhận vai trò đầu tiên của bạn (hay thực sự mà nói là cho bất cứ vai trò nào) chỉ dựa vào tiền nong. Làm việc cùng team mới chính là nơi có giá trị thực sự. Mình cũng học được rằng chức danh nghề nghiệp cũng không chứng tỏ được gì cả. Giống như việc là CTO của 1 team 5 người sẽ khác biệt với 1 team có 50 người hay 1 team có 500 người. Công việc và kỹ năng yêu cầu cũng hoàn toàn khác biệt, dù tước danh thì giống hệt nhau. Cho nên dù mình có 1 công việc với chức danh ‘senior’ thực sự không làm mình hoàn toàn trở thành 1 kỹ sư senior. Hơn thế nữa, các chức danh phân cấp cũng thường dễ bị thiếu sót, và khó để so sánh giữa các công ty. Mình học được điều quan trọng là đừng nên quá quan trọng các chức danh, mà chỉ nên dùng chúng như 1 dạng công nhận bên ngoài xã hội.
Trong nửa đầu sự nghiệp, mình làm về nghiên cứu. Nói rõ hơn là mình làm ở 1 dự án gây quỹ cộng đồng trong khoảng 3 năm rưỡi, và sau đó là tại 1 trường đại học ở NLP được 1 năm rưỡi. Phải nói rằng việc lập trình cho nghiên cứu khác hoàn toàn với việc lập trình trong ngành công nghiệp (thương mại). Phần lớn công việc mình sẽ không phải phát triển ứng dụng, mà sẽ làm việc với các thuật toán hay phân tích bộ dữ liệu. Còn nếu đang dựng ứng dụng thì khả năng cao là được gây quỹ từ cộng đồng – đồng nghĩa với việc app hoàn toàn free và dự án là open-source. Và khi 1 thứ gì đó miễn phí, có nghĩa rằng bạn không phải chịu trách nhiệm để làm cho chúng hoàn hảo nhất. Vì nó miễn phí mà. Bạn cũng không chịu trách nhiệm kiếm tiền từ app đó hay tạo ra sản phẩm, nhưng đó là 1 câu chuyện hoàn toàn khác khi làm lập trình viên trong học viện.
Sau đó mình rời khỏi học viện với khá nhiều kỳ vọng.
Kỳ vọng về công việc sẽ được triển khai như thế nào. Sẽ có automation, Pull request và code review .Nghe rất gì và này nọ. Ngoài ra còn là những dòng code đỉnh nhất, thêm nữa mình còn tin rằng mọi người trong ngành công nghiệp lập trình đều phải test. Trái với mong đợi, ngày đầu tiên đi làm của mình ở 1 startup và không hề có test tiếc gì. Chẳng có test cho frontend và cũng không có test cho backend.
Nada. Zip. Null. Undefined. NaN test. Không những không có test, mà dường như không ai có vấn đề gì với việc thiếu vị trí tester! Với 1 chút ngây thơ, mình cho rằng lý do không test vì mọi người không biết viết test cho AngularJS. Nếu mình dạy cho họ cách làm, mọi thứ sẽ ổn và chúng ta sẽ bắt đầu có test. Sai lầm! Nhiều năm sau đó, công ty mình thậm chí cân nhắc việc thêm test tự động vào code, và nó cũng không đơn giản như mình nghĩ. Nhưng không phải là vì mọi người không biết cách viết test. Họ cũng hầu như không bao giờ cảm nhận được nỗi khó chịu khi thiếu bước test ấy. Những gì cuối cùng mình học được Có khá nhiều công ty và startup có rất ít hoặc không hề có test. Khi chật vật để tìm thị trường sản phẩm phù hợp, hay chiến đấu để tồn tại, rất nhiều công ty bỏ qua việc test sớm. Ngay cả các công ty nhìn rất hào nhoáng, tài trợ cho các hội nghị hay code open-source – nên thành ra là nhiều nơi vẫn còn lượng Monolith lớn.
Thật sự không có công ty nào có tech setup hoàn hảo. Mỗi công ty đều có nhiều vấn đề riêng, mỗi công ty đều có technical debt của họ. Câu hỏi là họ đang làm gì với nó. Chúng ta không nên ảo tưởng khi ứng tuyển rằng luôn có việc gì đó cần phải hoàn thành – nếu không họ sẽ không thuê mình. Quá ngoan cố về các chủ đề mà bạn thiếu kinh nghiệm ngoài đời thực là khá kiêu ngạo. Mình tình cờ trở thành 1 người ‘biết tuốt’, khăng khăng phải có test nhưng hầu như không có bất kỳ kinh nghiệm nào về những gì có quy mô thực sự giống như vậy. Đừng như mình. Dù có nguyên tắc là tốt , nhưng bạn cũng phải cởi mở tiếp thu những kinh nghiệm và quan điểm của người khác.
Mình đã đọc rất nhiều bài blog. Mình đã xem nhiều nhiều cuộc hội đàm trên Youtube. Mình xem ‘StackOverflow’ hầu như suốt cả ngày. Dường như là mọi người đã và đang viết các ứng dụng siêu tinh vi và chất lượng cao với hiệu suất tuyệt vời và animation hào nhoáng, trong mình vẫn ở đây chắp vá nhiều thứ lại với nhau chỉ để làm nó chạy kịp thời trước deadline. Mình cơ bản thần tượng tất cả các công ty khác mà mình đọc được, và cảm thấy thất vọng về công ty của mình và dự án bị bỏ lại đằng sau.
Nhiều cuộc hội thảo thường bao gồm bằng chứng của các khái niệm hơn là kịch bản ngoài đời thực. Chỉ bởi vì bạn thấy 1 cuộc hội thảo nói về 1 công nghệ đặc thù, không có nghĩa rằng công ty đó đang sử cụng công nghệ như vậy trong công việc hàng ngày của họ, hay là tất cả code của họ đều hoàn hảo. Những người tham dự hội thảo thường là để giới thiệu các ứng dụng đồ chơi hơn là các trường hợp nghiên cứu thực tế, khá quan trọng để phân biệt 2 loại này. Đối mặt với legacy code (code không có test) là hoàn toàn bình thường. Nhưng sau khi dành nhiều thời gian cho các cuộc hội thảo và nói chuyện với những người làm việc ở những công ty công nghệ hàng đầu, mình cảm thấy nó trở nên rõ ràng hơn là chúng ta đều ở trên cùng 1 con thuyền. Công ty nào mà KHÔNG CÓ lượng monolith PHP hay Ruby khổng lồ mà họ đang cố thuần hóa chứ ? (hay buộc phải thuần hóa ở 1 vài thời điểm). Legacy code là chuyện bình thường, và học cách để đối phó với nó thường sẽ dạy cho bạn nhiều thứ hơn là chỉ dựng các ứng dụng từ scratch, vì bạn sẽ được tiếp xúc với các khái niệm mà bạn chưa hiểu.
Chất lượng code là điều quan trọng nhất.
Từng có ngày, nhận 1 review code từ mình có thể là việc khá tàn nhẫn. Mình khá kỹ tính trong việc code. Cách mình code khá tương đồng với style guide Airbnb JavaScript. Những thứ như indentation (thụt đầu dòng), format (định dạng), đặt tên, … Nếu ai đó “vượt qua” review code mà không nhận ít nhất 1 comment từ mình thì đó thật sự là “tâm linh tương thông” giao thoa với việc ‘trúng xổ số“, thật sự.
Thử tưởng tượng việc có hơn 50 comment trong PR của bạn với biết bao dấu ‘;’ bị thiếu sót… mình khá tinh mắt nên là mình muốn có những dấu ‘;’ chất lượng đó.
(May thay, mình đã không còn tinh mắt nữa sau khi nhìn chằm chằm vào máy vi tính từ năm này sang năm khác, nên là tha cho các bạn đấy! – Đùa tí thôi.) Điều cuối cùng mình học được Đủ tốt là đủ rồi. Khi quá chăm chút cho việc code cần “tốt” như thế nào sẽ gây ra việc suy giảm hiệu suất. Không cần phải sạch hoàn hảo để có thể hoàn thành công việc và cũng không hẳn là 1 thảm họa để duy trì. Đôi khi, code 1 cách lặp đi lặp lại nhiều hơn 1 chút hay dài dòng hơn 1 chút sẽ làm người khác dễ hiểu hơn. Và khái niệm ‘code tốt’ cũng không giống như ‘code nhìn giống như mình viết’. Kiến trúc code quan trọng hơn sự chi li. Đoạn code có thể từ từ cải thiện, nhưng các vấn đề lớn thường xuất hiện về phần cấu trúc. Đáng lẽ mình nên tập trung nhiều hơn về cấu trúc của ứng dụng hơn là chăm chút từng li từng tí khi mới bắt tay vào code. Chất lượng code khá quan trọng, và mình không nói ngoa đâu. Nhưng thực sự là chất lượng code không giống như những gì mình từng nghĩ, vốn mĩnh cho là những thứ như linting hay formatting hay bất cứ style gì được quảng bá trên các bài viết trên blog gần đây mà mình đã đọc.
Mọi thứ phải được tư liệu hóa – document.
Ở công ty đầu tiên, cũng là lần đầu tiên mình làm việc với nhiều code của người khác viết như vậy. Trước đó mình chưa từng phải tiếp nhận 1 codebase có sẵn và hình dung xem cái khỉ gì đang diễn ra như vậy. Có lần mình đã viết lại tất cả code thay vì cố gắng tìm ra cách hoạt động của nó. Dù sao thì, nó cũng không giúp được gì vì đó là code AngularJS được viết bởi lập trình viên Ruby, hay vì mình chỉ là 1 lập trình viên junior vốn không biết mình là 1 junior. Vậy cách mình lo liệu sự thật rằng 300 line code lạ lẫm làm cho mình như bị ngập ngụa trong nó? JSDOC. Ở KHẮP MỌI NƠI.
Mình bắt đầu bình luận mọi thứ để làm mọi thứ hợp lý hơn. Chú thích cho mỗi function mà mình có thể nắm được. Mình đã học được tất cả các syntax JSDoc hào nhoáng của Angular đó. Code của mình lúc nào cũng dài gấp đôi bởi vì có khá nhiều document và comment. Điều mình cuối cùng học được
Document cũng nhiều khi là xạo thôi. Khá dễ dàng để nghĩ rằng document là 1 giải pháp giải quyết tất cả. ‘Chúng tôi cần doc!’ Trong khi mình chưa đưa ra kết luận rằng chỉ vì doc là công việc khó nhằn, không có nghĩa là nó không đáng để làm 1 chút nào, mình học được rằng bạn phải “doc” lại đúng thứ theo đúng cách. Quá nhiều doc cho những thứ không cần thiết thường dẫn tới sự cứng nhắc, vốn có thể gây nhầm lẫn tới người đang cố fix 1 vấn đề nào đó. Ưu tiên automation hơn “doc” nếu được. Các test hay automation thường đi chung với nhau. Cho nên thay vào đó, mình cố tập trung về việc viết test, để các lập trình viên làm việc với code của mình có thể nhìn được các function của project với code đang hoạt động.
Technical debt khá là tệ
Có khoảng thời gian, mình nghĩ rằng bất cứ code ‘lộn xộn’ đều là technical debt. Technical debt là 1 cụm từ khá hài hước bởi vì nếu bạn hỏi mọi người để cho bạn 1 thí dụ để chỉ ra nó là cái gì, thì sẽ có rất nhiều câu trả lời khác nhau. Cho nên với tư cách là 1 người đã xem bất kỳ code ‘không đúng trật tự’ nào là technical debt, mình ngay lập tức cố để loại bỏ nó với cái rùng mình cùng cực. Từng có 1 lần, mình thực sự dành nguyên cuối tuần để fix thủ công tận 800 linting error. Mình biết mình đã quá rảnh rang (Dĩ nhiên đó là khi auto-fixing được ra đời) Điều mình cuối cùng học được Code không theo trật tự hay lộn xộn và technical debt hoàn toàn khác nhau. Chỉ bởi vì 1 thứ gì đó không ‘đẹp đẽ’ cho lắm không có nghĩa nó là technical debt. Technical debt thực sự sẽ làm bạn chậm lại theo nhiều cách, hay làm 1 số dạng thay đổi phức tạp hoặc dễ bị error. Nếu code chỉ hơi lộn xộn 1 chút, thì đơn giản là nó hơi thiếu trật tự chút thôi, và làm gọn nó có thể hơi tốn thời gian chút. Có vài technical debt là chuyện bình thường. Đôi khi chúng ta đi đường tắt bởi vì chúng ta cần chút thời gian, và vì vậy chúng ta từ bỏ ‘tốc độ’ của mình trong tương lai. Có nhiều phần code thực sự dính ‘technical debt’ cũng ổn thôi, miễn là bạn nhận ra được bạn sẽ phải cần để trả phần nợ đó lại sau. Nếu bạn nghĩ codebase của mình không có technical debt nào, có nhiều cơ hội là bạn đang đánh bóng quá mức thay vì tự nhìn nhận lại. Và mình cũng từng bị như thế rồi!
Có thâm niên = giỏi lập trình
Vì đã bắt đầu code từ khi còn nhỏ, mình khá thành thạo trong việc thực hiện các vòng lặp (hơn 15 năm kinh nghiệm). Đối với mình lập trình cũng gần như việc mình thở vậy. Khi 1 giải pháp đã rõ ràng, mình có thể chỉ cần gõ theo và code sẽ đi theo sau. Cũng giống như viết bài blog hay email. Mình có thể code ra giải pháp nhanh hơn bất kỳ ai, và thường đảm nhận các dự án phức tạp hơn cho bản thân. Trong 1 thời gian dài, mình nghĩ rằng đó là ý nghĩa của việc trở thành 1 lập trình viên senior. Sao lại không chứ? Chức danh công việc của mình là ‘lập trình viên senior’, chứ không phải ‘người giao tiếp senior’ hay ‘quản lý dự án senior’. Nên mình nghĩ là mình không cần phải thêm nhiều kỹ năng khác cho việc lập trình để thành 1 lập trình viên senior thực sự. Điều mình cuối cùng học được Kỹ sư senior phải phát triển nhiều kỹ năng bên cạnh việc lập trình. Số lượng kỹ năng mà mình phải phát triển trong thời gian đó là vô số kể, so với những gì mình thực sự nắm được. Trải dài từ giao tiếp và quản lý phụ thuộc tới chia sẻ bối cảnh, quản lý dự án, ước tính và công tác thành công với các đồng nghiệp không phải là lập trình viên. Những kỹ năng này ít có thể xác định số lượng hơn và cần nhiều thử nghiệm và sai sót để hoàn thiện. Không phải ai cũng trở thành ‘senior’ trong sự nghiệp của họ. Thâm niên trong nghề là kết quả của nhiều năm tích lũy kinh nghiệm. Và chưa hết, nhiều năm kinh nghiệm là chuyện cần thiết, nhưng chưa đủ điều kiện cho việc có thâm niên. Nó cũng phải là dạng kinh nghiệm phù hợp nơi bạn tiếp thu được những bài học phù hợp và áp dụng thành công những bài học đó trong tương lai. Đôi khi những bài học lớn hơn có thể mất cả năm hay nhiều hơn để tiếp nhận đầy đủ – đó là lý do tại sao nhiều năm kinh nghiệm vẫn khá quan trọng, ngay cả khi bạn là đã là 1 coder giỏi. Chúng ta vẫn còn là 1 junior trong vài lĩnh vực khác. Không quan trọng là bạn có bao nhiêu năm kinh nghiệm, vẫn có nhiều lĩnh vực khác mà bạn không biết nhiều về nó. Thừa nhận những gì bạn không biết là bước đầu tiên để lấp những khoảng trống đó và nhận sự giúp đỡ từ những người có nhiều kinh nghiệm.
Lời kết
Bài học số 1 mà bạn đã học được khi trở thành 1 lập trình viên junior là gì? Hay bài học hàng đầu mà bạn đang phải đối mặt, hãy chia sẻ nó với mình nữa nhé!
Từng gắn bó cùng Google hơn 5 năm với vị trí Software Engineer và thử sức tại các startup khác nhau về lĩnh vực Công nghệ, Nhân Nguyễn dừng chân tại Việt Nam và lập nghiệp với Kalapa với tư tưởng rất mới mẻ: cả công ty đều suy nghĩ sẽ hiệu quả hơn một người lãnh đạo – mô hình bottom up. Cùng trò chuyện với anh để hiểu hơn vì sao ở thế kỷ 21, nếu thiếu kiến thức về Toán, Tiếng Anh và Công nghệ thông tin thì bạn sẽ gần như là “mù chữ”.
Đôi nét về khách mời Nhân Nguyễn
Em được biết xuất thân của anh là một kỹ sư công nghệ, nhưng anh lại đầu tư khá nhiều vào các start-up, vậy lý do nào khiến anh làm như vậy?
Thật ra bất kỳ ai cũng có thể tìm hiểu và đầu tư chứ không gì những người làm kinh doanh. Background của mình là kỹ sư thì mình cũng có thể tích trữ và lên chiến lược đầu tư vào những gì có lợi nhuận, đơn giản là vậy.
Còn bây giờ mình sẽ giải thích lý do tại sao đầu tư start-up. Mình có đọc quyển sách đó là “Mass Flourishing” của Dr Phelps ở Đại học Columbia, ông có đến Google chia sẻ lý do những nước như Do Thái vì sao họ lại phát triển về công nghệ và kinh tế, bởi vì họ đầu tư vào start-up. Một quỹ của start-up của Silicon Valley là quỹ Sequoia từ Apple và Google thì nó tạo ra tổng giá trị trên thị trường là khoảng 20% của market cap của NASDAQ, nghĩa là tổng vốn hóa của NASDAQ là cỡ 20%, từ một quỹ của VC tức là họ tạo ra những công ty khủng. Đấy là lý do vì sao mình tập trung vào đầu tư start-up.
Liên quan đến start-up em có nghe nói, thành công thì mỗi người có công thức của riêng mình, nhưng thất bại thì lại có chung một công thức. Theo anh những case nào anh đã gặp phải trong quá trình đầu tư và bài học rút ra là gì?
Theo mình thì mỗi người cũng sẽ gặp thất bại “on their own ways” vậy, chứ cũng không có công thức chung đâu về thất bại đâu. Mình chọn founder khá kĩ vì founder là người đồng hành, thường mình không có vấn đề gì về tư cách đạo đức và khả năng, tư cách đạo đức của bạn ý là số một thì mình vẫn muốn chơi với bạn đó sau khi bạn fail, đa số những người mình đầu tư, công ty không thành công, cũng kha khá founder rồi đó, thì mình vẫn muốn chơi với founder đó, chứ không phải họ thất bại thì mình nghỉ chơi, dù sao họ cũng cố gắng hết sức.
Vấn đề ở con người đại đa số người Việt mình nghĩ là, người đấy thất bại nghĩa là người đấy không tốt, là hoàn toàn sai. Thì mình vẫn muốn chơi với người như vậy, những người chưa thành công, cái chưa thành công chưa phải là vấn đề quan trọng, bởi vì họ chưa thành công ở kèo này công ty này thì họ vẫn có thể thành lập công ty khác, khả năng của họ cao hơn hẳn. Đấy là cái thứ nhất.
Cái thứ hai, thường business model không hiệu quả. Ví dụ bỏ ra 2$ nhưng chỉ thu lại được 1$ thôi, thì mô hình này giống với WeWork, doanh thu khoảng 1 tỷ đô, nhưng chi phí cỡ 1,8 tỷ đô thôi, thường những cái model như thế khó mà khả năng thành công được, với WeWork bạn founder mà thành công thì bạn thành tỷ phú luôn rồi, chỉ có nhà đầu tư là chưa thôi.
Với vai trò là kỹ sư công nghệ chắc anh cũng từng làm việc với nhiều developer tại Việt Nam, vậy anh có nhận xét thế nào về developer Việt Nam và điều gì cần cải thiện thêm?
Developer Việt Nam rất là thực tế. Ngày xưa mình cứ nghĩ mô hình của Silicon Valley là đúng. Ví dụ như ở Google thì không có tester, người nào viết code thì người đó phải test, đó là nhiệm vụ của họ. Không phải một ông làm ra code dở rồi để ông khác dọn vệ sinh, thì đấy là không ổn, đó là tư duy của Google. Bên Microsoft thì không làm như vậy, Microsoft ở Seattle họ developer họ có tester riêng. Việt Nam mình thấy đi theo mô hình giống Microsoft hơn, bạn làm developer và bạn làm tester riêng. Ngày xưa khi mình làm ở Google thì mình thấy cái này không đúng, với cách tư duy riêng của mình thì mình thấy hiệu quả hơn hẳn vì ông thì đá bóng, ông thì thổi còi, ông đá bóng là ông developer, nhiệm vụ của ổng là tạo ra sản phẩm, mà sản phẩm của ông ý thì bug, ông ý mà tự chấm thì không công bằng chút nào, vì thế mà cần tester. Ở Kalapa, người đá bóng thì không được thổi còi, thế nên bây giờ mình bắt đầu tuyển tester rồi.
Hiện tại anh là một CEO của công ty công nghệ thì triết lý quản trị của anh như thế nào để giúp công ty tồn tại và phát triển ngày một mạnh hơn?
Mình cũng chẳng có triết lý gì đâu, cứ làm rồi sẽ thấy thôi. Mong muốn của mình là để các bạn trẻ được cọ xát với các bài toán, là cơ hội để các bạn lớn lên. Và mình hoàn toàn tin rằng lãnh đạo thường là những người không biết gì, thế nên toàn bộ công ty phải nghĩ, chứ mỗi lãnh đạo nghĩ thì không ổn. Mình nghĩ mình có tư tưởng này, có thể nguồn gốc xuất phát từ Google. Thực ra cả Google và Walmart họ đều có strong believe đó là bottom up, tức là nhân viên đều phải suy nghĩ cho cả công ty và có tính ownership, nghĩa là nếu mình là chủ của công ty thì mình sẽ action như thế nào, làm như thế nào. Chứ còn quản lý và quản trị nghĩa là từ top down, từ trên sẽ quản toàn bộ nhân viên ở dưới, như vậy thì không ổn lắm vì mình phải đi “soi” từng ông, rất là khó. Còn mô hình kia thì tất cả mọi người đều là chủ của công ty thì mình sẽ ứng xử như thế nào. Đấy là cách mình mong muốn công ty Kalapa hướng đến. Ví dụ như mình không thể hằng ngày đến xem nhân viên của mình có tắt điện hay chưa và đó cũng không phải là việc của mình, nhưng nếu mọi nghĩ mình là chủ của công ty này thì tất nhiên mình phải tắt điện thôi, những công ty còn rủ nhau tắt điện thì chưa phải là chủ đâu. Mình đôi lúc vẫn bị mắng là người cuối cùng làm việc ở công ty mà quên không tắt điện.
Trải nghiệm việc làm tại những doanh nghiệp lớn
Anh thường hay giới thiệu developer Việt Nam sang làm việc tại Google, như vậy thuật toán đang ngày một quan trọng và là cơ hội để làm việc tại các tập đoàn công nghệ lớn trên thế giới?
Ngày xưa năm 1945, Việt Nam có 90% không biết đọc, và trong thế kỷ 21, nếu như không biết lập trình, không biết tiếng Anh và không biết toán, 3 công cụ xuất hiện ở tất cả industry, tất cả các ngành. Banking cũng cần tiếng Anh, banking cũng cần toán, banking cũng cần công nghệ thông tin; bất động sản cũng cần tiếng Anh, bất động sản cũng cần toán, bất động sản cũng cần công nghệ thông tin. Nếu em không biết toán, không biết tiếng Anh, không biết công nghệ thông tin nghĩa là em mù chữ trong thế kỳ 21.
Tại sao anh quyết định rời Google chuyển sang làm việc tại Walmart mặc dù tại Google anh đạt được thành công nhất định, có phải anh thích điều gì đó trong ngành bán lẻ
Sau khi mình làm việc tại Google 5 năm rưỡi, đúng ra là mình thực tập tại Google và ra làm start-up được 1 năm thì Facebook mua lại, nhưng mà mình thấy ngưỡng mộ Google. Trong team của mình có 2 bạn, 1 bạn là HCV Toán quốc tế, 1 bạn là giải nhất Topcoder cho khối đại học và 1 bạn là giải nhất cho khối open, nghĩa là tất cả mọi người đều có thể thi được. Mình rất ngưỡng mộ những bạn đó, lúc mình làm ở Google mình chơi với những bạn như thế, cả team đấy gần chục người thì mình rất ngưỡng mộ. Và mình tự bảo vào Google là để mình học, sau 5 năm thì mình không học thêm được điều gì nữa, lúc đấy mình có một người bạn dạy cho mình default option, nghĩa là khi mình không làm thay đổi gì cả nhưng mình vẫn tiếp tục con đường đấy, lúc đó rất khó để mình quyết định có nên nghỉ việc hay không, bởi vì bình thường mình vẫn đi làm hằng ngày. Còn nếu theo một góc nhìn khác, giả sử mình đi xin việc lại, và mình biết Google như thế này và biết khả năng học của mình ở Google như thế này thì mình có xin vào đây không, và rất dễ mình sẽ trả lời là mình không xin vào Google nữa vì mình không học được gì thêm, cá nhân mình thấy khả năng học thêm là ít rồi nên mình rất dễ ra quyết định mình xin nghỉ.
Nhắc đến Google thì chắc có nhiều bạn đặt mục tiêu trong tương lai mong muốn làm việc tại Google. Với kinh nghiệm đã từng làm việc tại Google thì anh có thể chia sẻ lời khuyên hay một vài tips đến cho các bạn được không?
Mình rất mong muốn tạo cơ hội cho các bạn trẻ, nên mình có tạo một group Intern Candidate meet Referral, mình tạo group này trên facebook bởi vì ở Trung Quốc và Ấn Độ, họ có nhiều group để giới thiệu nhau vào công ty lớn, người đi trước support cho người đi sau thế nên cộng đồng của họ rất là mạnh, họ sẽ giúp đỡ lẫn nhau, Trung Quốc họ cũng giới thiệu lẫn nhau để vào Google hay Facebook. Ngày xưa khi mình học ở Canada, khi vào Google mình đã nhận offer của IBM rồi, thế nhưng bạn dạy đội tuyển trường UBC giới thiệu mình vào Google nên mình cancel việc thực tập tại IBM. Các bài toán ở IBM cho ngành tài chính cũng rất thú vị nhưng mình thấy Google xịn hơn nên mình nghỉ, mình sang làm cho Google. Theo chính sách của Google, những bạn giới thiệu người đã từng thực tập tại Google rồi thì không được tiền, bình thường khi một người giới thiệu một người vào làm fulltime thì sẽ được 4000$, nên mình bảo là mình không nhận việc tại Google nếu bạn nào không được 4000$, thế là 4000$ đấy chia cho 3 bạn. Ngày xưa mình chỉ giới thiệu vào làm thực tập thôi và mình không giới thiệu ai vào làm fulltime vì mình không cần 4000$ đó, giới thiệu thực tập thì không được tiền nhưng mất công phải trình bày lý do tại sao quen người này, người này có tố chất gì có tốt hay không để vào làm. Nhiều hôm mình điền form giới thiệu đến 2 – 3 giờ sáng. Và năm mình ở Google mình giới thiệu được 75 bạn, 15 bạn được vào Google, tỷ lệ 25%, tỷ lệ này là siêu cao so với mặt bằng chung, thời điểm 2008, 5000 hồ sơ nộp online hằng ngày, tỷ lệ được là 3/10000, 0.03, còn mình là 20%, gấp khoảng 600 lần.
Anh có thể chia sẻ thêm về 2 void complex project và contact switching scotley được không?
Mình được bạn giới thiệu vào Google, bạn đó là founder của Google Codejam, 1 kênh mà Google tuyển những người giỏi, giao cho nhiệm vụ là quản 30 bạn volunteer, các bạn tự tổ chức ra 1 cuộc thị thôi để xin kinh phí, tổ chức cuộc thi như sân chơi cho các bạn. Thì Google Codejam là về organ competition mà, và mình được quản 4 cuộc thi online thì mình sẽ chia việc cho từng bạn 1 và mình tạo ra cái Google worksheet để quản 20 bạn như thế, và các bạn làm việc fulltime, tuy mình là thực tập nhưng mình làm việc với cả Thomas Checka với Peter, nhũng người mà mình chỉ nhìn qua TV mà mình rất ngưỡng mộ hồi mình đi học nên mình rất hào hứng về cái việc tham gia cái đội ấy. Năm cuối cùng trước khi mình nghỉ Google thì các bạn lại mời mình tham gia để làm cùng với cả Google Codejam về phần tổ chức. Mình cũng có tham gia như khi làm việc fulltime rồi thì có rất nhiều pressure về KPI OKR nên là để làm được 2 project là 10 perfect time và Google Codejam và cái main project của mình thì rất là khó khi làm 2 cái cùng lúc.
Thế nên cái bài học của mình là 1 nghề cho chín còn hơn 90 nghề và có 1 vài bạn sinh viên gần đây hỏi mình là: “Nếu mà em ra trường, thì em có nên xin vào 1 công ty lớn như FPT rồi ở nhà em lại làm startup riêng của em” thì mình bảo là không nên làm như thế, mình đã suffer chuyện ấy rồi, cái việc chính của mình mà mình không tập trung 100% vào thì mình sẽ không đi đến đâu cả bởi vì người ta tập trung 120% mà người ta còn không đi đến đâu mà mình lại làm 2 việc cùng lúc thì khả năng fail của em là 100%, chứ không phải 99,999 mà là 100% luôn. Thế nên là các bạn trẻ thì nên đi ra làm công ty lớn để học cái process, cái nguyên tắc và sau đó có ý tưởng, có đam mê thì hãy đi ra làm khởi nghiệp. Nếu các bạn chân trong chân ngoài, vẫn đi làm nhà nước, vẫn đi làm FPT rồi em vẫn làm 1 cái startup của riêng em thì mình không khuyến khích việc đấy.
Theo em được biết anh là người đã giúp Google giải quyết các bài toán phân loại quảng cáo thì anh có thể nói rõ hơn các vấn đề của Google lúc đó và giải pháp của anh là gì không?
Team của mình thì làm chất lượng quảng cáo, nguyên tắc và nguyên lý của nó cũng rất đơn giản thôi, quảng cáo dở hơi, người dùng không thích không click vào thì không cho lên luôn, còn những quảng cáo người dùng người ta đến họ thích và click vào, có thể người ta mua hàng hay gì đấy thì nghĩa là nó chất lượng tốt nên nguyên lý nó chỉ là như vậy thôi. Cách làm thì mình sẽ dùng Machine Learning để tính và click xem vào đấy để xem cái quảng cáo này có tốt hay không.
Ở Google thường thì có hàng ngàn dự án, nhưng số dự án thành công chỉ có từ 2-3. Anh có thể chia sẻ một số dự án rất là tiềm năng để có thể triển khai nhưng đã thất bại hay không?
Dự án to nhất mà mình là leader ở Google thì nó ảnh hưởng khoản chừng 5% doanh thu, thời đấy nguồn doanh thu là 29 tỷ thì 5% là 1,5 tỷ, dự án ấy tên là Near Exact Match, thí dụ em đánh sai chính tả cái tên Hilary hay là Obama chẳng hạn thì Google nó sẽ correct, tức là nó sẽ đưa ra kết quả tìm kiếm của đúng tên bà Hillary hay Obama thôi, chữ Hillary có 1 chữ ‘l’ hay 2 chữ ‘l’. Bên search họ đã làm như thế rồi và bên quảng cáo thì chưa làm, bên quảng cáo khi em search từ gì thì em phải edit đúng từ đấy mới ra, nó gọi là misspelling. Trước lúc mà mình làm dự án này thì mình làm cái analysis và kiểu nó là báo cáo, nếu mình làm cái này thì mình sẽ kiếm thêm bao nhiêu tiền cho Google, và nó dưới hình thức gọi là 1% traffic của Google sẽ được chạy cái hệ thống mới và bọn mình không thu tiền và đưa quảng cáo của nhà quảng cáo lên nhưng không thu tiền advertiser, và 1% traffic mình tính rất là ok, khi mình đưa cái này lên thì cái impact nó là bao nhiêu %, tức là trước khi làm dự án thì mình phải tính là cái dự án này nó ra bao nhiêu tiền, thì ý tưởng thì bên search đã làm rồi bọn mình chỉ là copy thôi và trước khi làm doanh thu bọn mình tính cho Google là 1 tỷ USD, thế nên dự án đó được viết vào cái OKR của công ty năm ấy.
Việc triển khai A/B testing, chạy song song 50-50 cho hệ thống mới và cũ để đo lường hiệu quả về doanh thu cho một hệ thống khổng lồ như Google có gặp khó khăn gì không anh?
Nó rất là đơn giản thôi, tức là em có 10 cái em muốn thử, thí dụ như 1 cái em thay đổi giao diện chẳng hạn, 1 cái em thay đổi thuật toán, 1 cái em thay đổi là cái database nó sẽ ảnh hưởng độ nhanh chậm của hệ thống, 3 cái đấy là 3 cái layer khác nhau, 1 cái là UI, 1 cái là thuật toán, 1 cái là server – tức là nhanh chậm, độ ổn định của server. Thì 3 cái đấy là 3 cái layer khác nhau, rất là rõ, và người ta sẽ thử nghiệm với 1 người dùng bất kỳ thì có thể người ta dùng UI cũ hay UI mới, thì họ cứ tung cái đồng xu lên: mặt người là ông cũ, không phải mặt người là ông mới, với lại hệ thuật toán thì lại tung 1 đồng xu nữa, và các ông khách hàng, mỗi ông sẻ có cái trải nghiệm khác nhau với hệ thống UI cũ và UI mới, thuật toán cũ và thuật toán mới và server cũ và server mới, thì họ có hàng tỉ những experiment như thế và cứ mỗi 1 experiment, mỗi cái thay đổi ấy chia ra là cũ và mới, 50-50, tung đồng xu mà và nếu mà cái assumption rằng tôi không biết những cái khác, tôi chỉ biết là trong cái phần ảnh hưởng đến doanh thu của tôi thì nó như thế nào, nếu nó tốt tôi sẽ release, nếu không tốt thì tôi dẹp.
Khởi nghiệp tại Việt Nam và những bài toán
Vì sao anh quyết định rời Silicon Valley để về Việt Nam khởi nghiệp Kalapa và có phải anh đã nhận ra được cái vấn đề gì đó ở thị trường Việt Nam và giải pháp nào của Kalapa là anh tự tin nhất để giải quyết được những cái vấn đề này?
Thì có 2 nhóm các anh ở VN qua và 1 anh thì ở Sing qua, thì Silicon Valley nó mang 1 thông điệp là cơ hội không ở Mỹ mà nằm ở Đông Nam Á, anh Peng ở Singapore làm ở quỹ Beverly Hills Venture thì anh đó bảo Đông Nam Á sẽ cần khoảng 1000 tỷ đô cho vay bởi vì khu vực đang phát triển nên họ cần vốn và cơ hội rất là nhiều và những người mà đã thành công ở Trung Quốc thì thường là những người đi học ở nước ngoài về và 1 anh nữa là anh Lê Hồng Minh team VNG, thì sang và bảo có rất nhiều cơ hội ở Việt Nam, và ở Đông Nam Á, thì ở Mỹ rất khó khăn, mình về Việt Nam nhìn đâu cũng có cơ hội, và quyết định để mình về Kalapa thì ở Mỹ khi mình vay mua nhà, thì lãi suất chỉ từ 3-4% và vay mua nhà ở VN là 10% 1 năm, thì không hiểu làm sao mà các bạn có thể mua nhà được, vì 1 tỷ 1 năm trả 100 triệu, thì chia ra 1 tháng phải mất 8tr rồi, thì mình nghĩ là quá đắt và tại sao lại đắt như thế, thì khi mình thấy cơ hội lại cao thì mình lại để công nghệ giải quyết bài toán đấy.
Quá trình eKYC được diễn ra như thế nào? Giữa KYC truyền thống thông qua gặp trực tiếp và eKYC có những khó khăn hay thuận lợi nào? Đặc biệt ở bài toán Anti Fraud?
Trong luật của Ngân hàng theo mình hiểu, thì chưa được phép làm được phép làm eKYC và bắt buộc khi mà khách hàng vay 1 khoản vay thì phải ra gặp gỡ nhau để tránh việc là fraud là gian lận tài chính hay tín dụng, chắc do sợ là cho vay online thì sẽ rất nhiều gian lận, có thể là ăn trộm hoặc mua thẻ căn cước công dân của 1 ông này xong rồi lắp mặt của mình vào, xong rồi vay. Thì cái này là chiêu rất cơ bản của đội làm gian lận tín dụng, bởi vì là gian lận nhiều quá thôi, vay 1 triệu mà đến khoảng 50% không trả nợ thì lãi suất phải đẩy lên thôi, không có cách nào khác cả, và eKYC thì nó có tiềm năng gì? thì chi của 1 bạn đi gặp bạn vay thì đã mất khoảng tầm ít nhất là 100 nghìn, và có 1 đội chỉ chuyên đi thu hồ sơ, chụp ảnh cho vay các kiểu là mất khoảng 150K, 120K, đó là cách truyền thống KYC. Còn eKYC thì họ làm hoàn toàn online, ảnh chứng minh đây, có matching với mặt hay không và những cách công nghệ mới là họ dùng video, tức là họ phải làm theo cái instruction và làm theo cái ‘quay trái – phải, trên – xuống’ thì cái video là không fake được nhé, và cái thứ 2 là matching chứng minh thư, thì công nghệ làm được hết rồi, đấy là eKYC thì họ sẽ giúp được 2 thứ là nhanh và giảm chi phí, giảm thời gian vay và có thể phục vụ được trên toàn cả nước, còn nếu mà bây giờ mà ngân hàng mà không có 1 cái chi nhánh nào ở huyện đấy là chịu, thì nó giải bài toán về financial inclusion, tức là ai cũng có thể có nhu cầu vay, tức là họ vay mua 1 con lợn chẳng hạn, mà họ không có tiền vay thì chịu, không sinh ra được doanh thu cho người nông dân.
Rất cảm ơn phần chia sẻ của anh Nhân về những kinh nghiệm tại các tập đoàn công nghệ, Hy vọng qua bài viết này các bạn đọc giả sẽ hiểu hơn về mô hình bottom-up, về quy trình tuyển dụng hay tích lũy cho mình các lời khuyên nếu muốn thử sức với start-up của riêng mình. Và TopDev cũng mong rằng với kinh nghiệm từ các công ty công nghệ và nền tảng vững chắc, anh Nhân sẽ đồng hành và phát triển Kalapa ngày một lớn mạnh.
Từ xa xưa tôi đã ghét việc testing, nó không quan trọng với tôi, tôi không thấy lý do gì để làm việc này, kiểu như phí tiền và thời gian vậy.
Trong suốt sự nghiệp trước đây, tôi chưa bao giờ nói về cách nào, tại sao hoặc có nên test software của mình. Tôi đưa ra rất nhiều biện hộ cho việc không muốn học hỏi vụ này. Tôi nói với nhiều developer về điều này, những người cũng không ngừng biện hộ như tôi.
Trong suốt thời gian làm việc với những người khác trước đây, tôi đã trải qua rất nhiều quan điểm trái ngược khác nhau về software testing. Sau đây là vài lý do phổ biến nhất mà các developer đưa ra để không phải test software.
Code của tôi chạy hoàn hảo. Sao tôi phải test?
Tôi chưa bao giờ gặp một lập trình viên nào hoàn hảo cả, và cũng không nghĩ tồn tại một người như thế.
Lấy ví dụ ở các công ty công nghệ lớn trên thế giới như Facebook, Google, Rockstar, Sony…Họ thuê những developer thông minh nhất trên thế giới, nhưng các developer đó vẫn viết ra những mã không bảo mật.
Câu trả lời của tôi đối với những người cho rằng code của họ hoàn hảo: Sao bạn biết code của bạn là hoàn hảo? Bạn đã test nó chưa? Bạn có thể test nó liền và nói cho tôi biết là nó đã chạy hoàn hảo?
Tham khảo thêm các việc làm tester lương cao cho bạn tại đây
Nhưng mà, tôi không biết test cái gì bây giờ?!
Test tất cả mọi thứ! Ngoại trừ code của bên thứ ba vì họ đã tự test rồi!
Tôi xin trích dẫn một câu trả lời từ StackExchange bởi vì nó hợp lý.
1. Test mọi trường hợp phổ biến nhất có thể. Nó sẽ cho bạn thấy khi nào code của bạn lỗi khi thực hiện vài thay đổi(Quan điểm của tôi đây là lợi ích lớn nhất của automated unit testing )
2. Test những trường hợp nổi cộm có dính đến những đoạn code phức tạp mà bạn nghĩ rằng có thể xảy ra lỗi
3. Khi bạn tìm thấy một lỗi, hãy viết test case lại trước khi fix nó.(Để sau này dùng automation testing hoặc tester dùng)
4. Đưa những trường hợp nổi cộm này vào các code ít quan trọng hơn để khi nào đó có ai đó có thời gian xử lý nó
Thật khó để biết bắt đầu từ đâu khi bạn vẫn còn mới trong thế giới software testing. Có nhiều thể loại software testing. Tôi luôn đề xuất các beginner bắt đầu với Unit Testing, Integration Testing và Regression Testing.
Có rất nhiều phương pháp kiểm thử phần mềm. Một số developer sẽ không bao giờ cần phải làm việc này nếu họ đang làm việc trong một nhóm, nhưng ít nhất bạn cũng nên biết sự khác nhau giữa chúng:
Acceptance testing
Alpha testing
Beta testing
Black box testing
Comparison testing
Compatibility testing
End-to-end testing
Functional testing
Incremental integration testing
Install/uninstall testing
Integration testing
Load testing
Performance testing
Recovery testing
Regression testing
Sanity testing
Security testing
Stress testing
System testing
Unit testing
Usability testing
White box testing
Nếu bạn muốn biết thêm về tất cả các thể loại khác nhau của kiểm thử phần mềm, bạn nên đọc this article.
Điều quan trọng là kiểm thử là cần thiết chứ không phải là tùy chọn
Testing vừa khó khăn vừa khó hiểu
Mọi thứ đều sẽ khó khăn nếu bạn không biết cách thực hiện. Sẽ tốn thời gian, thực hành, kinh nghiệm và kiên nhẫn. Hãy thư giãn, thả lỏng và tìm niềm vui khi học. Hãy mong đợi một thất bại và nhầm lẫn lúc ban đầu, đừng mong thành công ngay. Bạn cũng chỉ là con người thôi!
Một khi bạn đã học và cảm thấy thoải mái với việc test, bạn sẽ thấy nó rất đơn giản
Lấy một cuốn sách, đọc nó, trao đổi với các developer khác trên IRC/Slack/Discord v.v…
Testing khiến kéo dài thời gian phát triển 🙁
Đây là lý do biện hộ rất sai làm và phổ biến
Bất kỳ ai mới vào nghề testing ban đầu sẽ cố gắng, rồi sau đó, cảm thấy không thoải mái. Bạn là con người, việc này rất bình thường.
Trong giai đoạn đầu sẽ rất tốn thời gian nhưng hãy tiếp tục gắn lấy nó, cuối cùng nó sẽ ăn vào máu của bạn thôi. Thủ thuật ở đây là hảy xem nó như là một phần của quy trình phát triển phần mềm, vì vậy sẽ trở thành thói quen.
Viết các test case sẽ tiết kiệm khá nhiều thời gian và tránh nhức đầu về sau. Lặp lại việc testing bằng cách click vào cái nút và xác nhận mọi thứ chạy đúng như mong đợi khiến bạn cảm thấy tự tin khi giao nó cho khách hàng.
Bạn sẽ có cảm giác mãn nguyện khi code vượt qua hết các giai đoạn test. Việc bảo trì các đoạn code có khả năng test được luôn luôn dễ, sướng hơn là làm việc với những hệ thống không lặp lại việc test.
Bạn đang lo lắng khi lần đầu phỏng vấn? Bạn cảm thấy thiếu tự tin về kinh nghiệm khi apply vào các công ty IT? Đừng hoang mang vì hôm nay, TopDev sẽ bật mí với các bạn những câu hỏi phỏng vấn từ các các nhà tuyển dụng IT. Bài viết là những chia sẻ thông qua các trải nghiệm tuyển dụng thực tế của đội ngũ TopDev, hy vọng sẽ có ích cho các bạn.
Thách thức bài test đầu vào – Liệu bạn đã sẵn sàng?
Nghe thì đã sợ, đó là cảm giác ám ảnh suốt một khoảng thời gian dài đúng không nào? Tuy nhiên, bạn đừng lo, bài test đầu vào của một công ty IT nhằm đánh giá tổng quát những kiến thức cơ bản của bạn về vị trí ứng tuyển. Vì thế, bạn nên thoải mái, giữ một tinh thần tốt để sẵn sàng hoàn thành bài thi bất cứ lúc nào nhé.
Cụ thể trong thách thức đầu tiên, bạn cần thể hiện mình có những am hiểu cơ bản về chuyên môn lập trình, tư duy logic và khả năng về ngoại ngữ. Trong đó, bài thi về chuyên môn lập trình bao gồm bộ câu hỏi trắc nghiệm nhằm giúp bạn hệ thống lại các kiến thức xoay quanh nền tảng lập trình (Java core), web (HTML, CSS, JS), database. Chung quy lại, việc kiểm tra năng lực của bạn sẽ đi từ việc khai thác kiến thức Front-end đến Back-end và Database.
Quan trọng nhất – Vòng phỏng vấn trực tiếp
Đây có thể nói là vòng quan trọng nhất bởi bạn sẽ được phỏng vấn trực tiếp bởi đội ngũ chuyên môn đến từ các Team Leader tại công ty. Thông thường, các bạn sẽ được hỏi các kiến thức từ cơ bản đến nâng cao. Sau đây, TopDev sẽ đưa ra danh sách các câu hỏi được phân loại tương ứng từng loại kiến thức chuyên môn. Đây là sườn những vấn đề và câu hỏi thường được nhà tuyển dụng hỏi để đánh giá năng lực và tiềm năng phát triển của ứng viên.
1. Câu hỏi cá nhân:
Giới thiệu bản thân: Bạn có thể nói sơ về số năm kinh nghiệm, sở thích về công nghệ, vị trí và dự định muốn làm (Dành cho khoảng này 2-3 phút thôi nhé)
Hãy nói về 1 project bạn đã làm? Bạn làm vai trò gì?: Người phỏng vấn sẽ hỏi khá sâu về cấu trúc project, những việc đã bạn làm, kể cả những khó khăn bạn gặp phải và kèm theo cách xử lý và vượt qua nó. Chính quá trình xử lý vấn đề họ sẽ đánh giá được nhiều điều từ bạn qua câu hỏi này.
2. Câu hỏi về chuyên môn:
Bộ câu hỏi tổng hợp được chia nhỏ theo nhiều skill, hãy chuẩn bị kỹ lưỡng trước càng sâu các skill trong chuyên môn và những gì bạn đã đề trong CV. Bạn sẽ được hỏi đầy đủ từ backend, đến frontend và cả một số các framework liên quan. Ngoài lý thuyết, bạn có thể còn được hỏi cách giải quyết 1 vấn đề cụ thể nào đấy, hãy chuẩn bị kỹ lưỡng nhé!
Bộ cheatsheet bạn có thể tham khảo:
Kiến thức Java nền tảng
Thế nào là lập trình đối tượng? Cho biết các tính chất đặc thù của lập trình hướng đối tượng?
Sự khác nhau giữa While và doWhile?
Cách tổ chức hoạt động của các Collection Framework như List , Map, Set, Queue, Stack,..?
Phân biệt ArrayList , Linkedlist và Vector?
Sự khác nhau giữa ArrayList – Array, Linkedlist – Arraylist, Set – List, Override – Overload?
Khái niệm về Generic? Cho ví dụ và lý do sử dụng?
Sự khác nhau giữa Abstract class và Interface?
Khái niệm tham trị và tham chiếu?
Ngoại lệ (Exception là gì)? Phân biệt Check và Uncheck exception?
Thuật toán tìm kiếm nhị phân và thuật toán sắp xếp?
3. Câu hỏi đánh giá về khả năng tiếp thu kiến thức
Câu hỏi này như một thách thức thêm để đánh giá mức độ cập nhật các xu hướng công nghệ mới của từng ứng viên.
Qua câu hỏi này, nhà tuyển dụng IT không đưa ra sự kết luận cuối nào cho kết quả tuyển dụng ứng viên, chỉ là xác lập thêm tiêu chí ứng viên đó có khả năng tự tìm hiểu về lĩnh vực mình theo đuổi hay không. Đó là điểm cộng lớn cho các ứng viên.
Lúc này sẽ có thêm một số câu hỏi cá nhân để không khí bớt căng thẳng: Bạn có sở thích gì? Bạn có điểm yếu điểm mạnh gì?,…Cứ trả lời thành thật! Bạn sẽ không chỉ được đánh giá qua kỹ năng technical, mà còn đánh giá qua thái độ làm việc, thái độ trả lời câu hỏi. Có nhiều câu hỏi bạn không biết, nhưng nếu cố gắng trả lời, thể hiện thái độ muốn học hỏi bạn vẫn sẽ được đánh giá cao nhé.
* Cuối buổi phỏng vấn: Bạn sẽ được hỏi rằng “Có câu hỏi gì không?” Đừng ngại mà hỏi các câu hỏi như: Môi trường làm việc ra sao, có yêu cầu OT hay không? Chính sách review tăng lương tăng thưởng thế nào? Công ty có tổ chức seminar hay chính sách gì để giúp nhân viên phát triển không?. Những câu hỏi này sẽ thể hiện bạn có tinh thần làm việc nghiêm túc, biết suy nghĩ đến tương lai.
Lời kết
Những câu hỏi trên là những câu hỏi thông dụng nhất được tập hợp lại và chia sẻ thông qua các trải nghiệm tuyển chọn cá nhân. TopDev mong rằng, các bạn sẽ trang bị cho mình năng lực chuyên môn, các kỹ năng cần thiết và quan trọng là một thái độ tốt. Hãy nhớ rằng, sau buổi phỏng vấn, nhớ gửi một email cảm ơn cho người đã phỏng vấn mình. Đây là một điều nho nhỏ, hiệu quả lại lơn lớn mà các bạn thường “quên” không làm.
<link rel="preload" /> sẽ báo với trình duyệt download và cache một resource (như script hoặc stylesheet) nhanh nhất có thể. Nếu chúng ta cần resource đó ngay sau khi trang đang load.
Một khi trình duyệt đã download xong resource này, trình duyệt sẽ không làm gì hết, file script đó sẽ ko được thực thi, file stylesheet sẽ ko được áp dụng. Nó cache lại ở đó, khi có một thằng nào khác cần tới nó, nó sẽ được cung cấp ngay lập tức.
<link rel="prefetch" /> yêu cầu trình duyệt download và cache lại resource ngầm bên dưới, nó sẽ có độ ưu tiên thấp, không tranh giành thứ tự ưu tiên với các resource quan trọng hơn. Thí dụ như bạn cần resource đó ở các trang sau nữa, bạn có thể load trước để sẵn ở trang hiện tại.
Ví dụ, user di chuyển từ home page sang trang product page, đa phần luồng đi của user sẽ là như thế, trừ trường hợp học bookmark lại trang đó, hoặc nhấp vào một link được share. Chúng ta có thể sử dụng <link rel="prefetch" /> để tải trước các file css, js sẽ dùng trên trang product.
preconnect
<link rel="preconnect" /> được dùng để tăng tốc độ load ban đầu bằng việc báo với trình duyệt, chúng ta sẽ load một resource từ domain nào đó không sớm thì muộn. Thí dụ chúng ta load font từ Google, CDN, JSON từ API server.
Thực hư tăng tốc được bao nhiêu thì cũng chưa rõ, nhưng đây là cách chúng ta báo với trình duyệt
<link rel="dns-prefetch" /> công dụng cũng tương tự như preconnect, nó sẽ setup sẵn các config cần thiết trên trình duyệt khi cần thực hiện một DNS resolution
<link rel="prerender" /> yêu cầu trình duyệt load 1 url và render nó trong một tab ẩn, khi user click vào đường link đến url đó, trang web sẽ được hiển thị ngay và luôn.
Tuy nhiên là thuộc tính này tính đến thời điểm hiện tại rất ít trình duyệt hỗ trợ
Bài này chỉ phù hợp với các bạn đã có kiến thức trung bình khá javascript trở lên, mình không chỉ đơn giản giải thích cách xài mà còn sâu hơn, bạn sẽ nắm rất rất rõ prototype trong javascript thực chất là gì
Object trong javascript rất là vi diệu. Nó là nền tảng của rất nhiều thứ hay ho trong javascript.
Object là một cặp giá trị key/value. Cách đơn giản nhất tạo một object là obj = {}, thêm các property và phương thức sử dụng dấu chấm
let animal = {}
animal.name = 'Leo'
animal.energy = 10
animal.eat = function (amount) {
console.log(`${this.name} is eating.`)
this.energy += amount
}
animal.sleep = function (length) {
console.log(`${this.name} is sleeping.`)
this.energy += length
}
animal.play = function (length) {
console.log(`${this.name} is playing.`)
this.energy -= length
}
Quá đơn giản. Giờ chúng ta muốn có thêm một animal khác, chúng ta đưa toàn bộ logic này vào bên trong 1 function, cách này gọi là Functional Instantiation hay constructor function
function Animal (name, energy) {
let animal = {}
animal.name = name
animal.energy = energy
animal.eat = function (amount) {
console.log(`${this.name} is eating.`)
this.energy += amount
}
animal.sleep = function (length) {
console.log(`${this.name} is sleeping.`)
this.energy += length
}
animal.play = function (length) {
console.log(`${this.name} is playing.`)
this.energy -= length
}
return animal
}
const leo = Animal('Leo', 7)
const snoop = Animal('Snoop', 10)
Khi chúng ta muốn tạo một instance mới của Animal, tất cả những gì chúng ta cần làm là gọi lại hàm Animal.
Cách làm này có một điểm hạn chế, các phương thức eat, sleep, play là hoàn toàn giống nhau cho các instance, đồng thời khi tạo một instance mới chúng ta cũng đã vô tình lãng phí bộ nhớ bằng việc khai báo thêm những object mà đôi khi không cần thiết.
Chúng ta sẽ tách các phương thức này ra. Từ ngữ chuyên môn cho vấn đề này là Functional Instantiation với các phương thức dùng chung.
const animalMethods = {
eat(amount) {
console.log(`${this.name} is eating.`)
this.energy += amount
},
sleep(length) {
console.log(`${this.name} is sleeping.`)
this.energy += length
},
play(length) {
console.log(`${this.name} is playing.`)
this.energy -= length
}
}
function Animal (name, energy) {
let animal = {}
animal.name = name
animal.energy = energy
animal.eat = animalMethods.eat
animal.sleep = animalMethods.sleep
animal.play = animalMethods.play
return animal
}
Các phương thức dùng chung giờ đây nằm ở từng object và refer đến object bên trong của Animal.
Object.create
Nâng cấp thêm chút nữa bằng Object.create. Object.create cho phép bạn tạo một object, nếu không tìm thấy nó sẽ đưa về một object khác để xem có thể tìm thấy property đó không.
Trong ví dụ trên, bởi vì children được tạo bởi Object.create(parent), khi nó không tìm thấy property trong children, javascript tự nó biết tìm đến parent object. Trong ví dụ này, child không có property là heritage, mà parent có, nên nó sẽ lấy của parent là Irish
Giờ làm sao chúng ta đơn giản hoá code của Animal? Thay vì thêm tất cả các phương thức dùng chung vào Animal từng thằng một, có thể dùng Object.create để truyền object animalMethods
const animalMethods = {
eat(amount) {
console.log(`${this.name} is eating.`)
this.energy += amount
},
sleep(length) {
console.log(`${this.name} is sleeping.`)
this.energy += length
},
play(length) {
console.log(`${this.name} is playing.`)
this.energy -= length
}
}
function Animal (name, energy) {
let animal = Object.create(animalMethods)
animal.name = name
animal.energy = energy
return animal
}
const leo = Animal('Leo', 7)
const snoop = Animal('Snoop', 10)
leo.eat(10)
snoop.play(5)
Bây giờ khi gọi leo.eat, javascript sẽ tìm phương thức eat trên object leo. Nếu fail, nó đưa đến animalMethods trong đó có hàm eat
Làm như vậy có thể bị xem là hơi tricky khi quản lý một object độc lập cho các phương thức dùng chung.
Javascript chúng ta có prototype đảm nhiệm việc này mà bạn không cần viết thêm gì cả.
Tất cả function trong Javascript có một property là prototype, nó reference đến một object.
Holy grab? Không tin có thể test
function doThing () {}
console.log(doThing.prototype) // {}
Thay vì viết Object.create(animalMethods), chúng ta cứ dùng luôn object có sẵn là prototype
function Animal (name, energy) {
let animal = Object.create(Animal.prototype)
animal.name = name
animal.energy = energy
return animal
}
Animal.prototype.eat = function (amount) {
console.log(`${this.name} is eating.`)
this.energy += amount
}
Animal.prototype.sleep = function (length) {
console.log(`${this.name} is sleeping.`)
this.energy += length
}
Animal.prototype.play = function (length) {
console.log(`${this.name} is playing.`)
this.energy -= length
}
const leo = Animal('Leo', 7)
const snoop = Animal('Snoop', 10)
leo.eat(10)
snoop.play(5)
Hy vọng là bạn có giây phút ERECA khi đọc tới đây, như mình đã có. prototype chỉ là một property mà tất cả function trong javascript đều có.
Sâu hơn xa hơn
Tới thời điểm này, chúng ta đã biết
Tạo một function constructor
Thêm phương thức cho function constructor bằng prototype
Sử dụng Object.create để khi fail trỏ đến prototype
Cái này là quá căn bản với các ngôn ngữ lập trình khác, không lẽ javascript lại tệ đến vậy sao, không có một cách chính thống để làm? Có chứ, sử dụng new
Tại sao chúng ta phải đi cả ngàn dặm tới bước này, sao mình không nói toạc luôn ngay từ đầu? Với cách này bạn sẽ nắm rất sâu, hiểu rất rõ new sẽ làm gì bên dưới
Xem lại constructor Animal, 2 phần quan trọng nhất là tạo object và return nó.
function Animal (name, energy) {
let animal = Object.create(Animal.prototype)
animal.name = name
animal.energy = energy
return animal
}
new thì có gì hót – khi gọi một function sử dụng new, 2 dòng code này sẽ được chạy luôn cho mình và object được tạo ra gọi là this
Cách viết dùng new
function Animal (name, energy) {
// const this = Object.create(Animal.prototype)
this.name = name
this.energy = energy
// return this
}
Animal.prototype.eat = function (amount) {
console.log(`${this.name} is eating.`)
this.energy += amount
}
Animal.prototype.sleep = function (length) {
console.log(`${this.name} is sleeping.`)
this.energy += length
}
Animal.prototype.play = function (length) {
console.log(`${this.name} is playing.`)
this.energy -= length
}
const leo = new Animal('Leo', 7)
const snoop = new Animal('Snoop', 10)
Không dùng new, lỗi
function Animal (name, energy) {
this.name = name
this.energy = energy
}
const leo = Animal('Leo', 7)
console.log(leo) // undefined
WTF? Cả đống này chỉ là để làm cái class trong các ngôn ngữ khác thôi ư?
Đúng. Trước thời ES6, javascript không có vụ class này, chúng ta dùng như vậy đấy.
Vậy nếu bạn đang đọc bài này, thì bạn đã qua thời ES6, ES7, chúng ta có cách chính thống để làm. Bên dưới ES6 thì nó cũng làm i chang như vậy thôi, chẳng qua là bạn được viết bằng cách có “gu” hơn, chứ bên dưới nó vẫn implement như thế.
classAnimal{constructor(name, energy){this.name = name
this.energy = energy
}eat(amount){
console.log(`${this.name} is eating.`)this.energy += amount
}sleep(length){
console.log(`${this.name} is sleeping.`)this.energy += length
}play(length){
console.log(`${this.name} is playing.`)this.energy -= length
}}const leo =newAnimal('Leo',7)const snoop =newAnimal('Snoop',10)
Một số phương thức với prototype nên biết
Lấy tất cả prototype của function
Object.getPrototypeOf()
function Animal (name, energy) {
this.name = name
this.energy = energy
}
Animal.prototype.eat = function (amount) {
console.log(`${this.name} is eating.`)
this.energy += amount
}
Animal.prototype.sleep = function (length) {
console.log(`${this.name} is sleeping.`)
this.energy += length
}
Animal.prototype.play = function (length) {
console.log(`${this.name} is playing.`)
this.energy -= length
}
const leo = new Animal('Leo', 7)
const prototype = Object.getPrototypeOf(leo)
console.log(prototype)
// {constructor: ƒ, eat: ƒ, sleep: ƒ, play: ƒ}
prototype === Animal.prototype // true
Có 2 điểm quan trọng trong đoạn code trên
1 là chỗ constructor cũng được liệt kê ra như một hàm, như vậy bất kỳ instance nào cũng có thể gọi đến constructor bằng instance.constructor
2 là nếu so sánh Object.getPrototypeOf(leo) === Animal.prototype là đúng.
Xác định một property có tồn tại trong prototype không
.hasOwnProperty()
const leo = new Animal('Leo', 7)
for(let key in leo) {
if (leo.hasOwnProperty(key)) {
console.log(`Key: ${key}. Value: ${leo[key]}`)
}
}
kiểm tra một object có phải là một instance của Class
object instanceof Class
function Animal (name, energy) {
this.name = name
this.energy = energy
}
function User () {}
const leo = new Animal('Leo', 7)
leo instanceof Animal // true
leo instanceof User // false
Lưu ý về arrow function
Do arrow function không có this bên trong nó, không thể dùng nó như một constructor function
const Animal = () => {}
const leo = new Animal() // Error: Animal is not a constructor
Đồng thời arrow function cũng sẽ không có prototype
Khi sử dụng VSCode chắc ai cũng cài thêm một mớ extensions, lỡ ngày nào cài lại máy, hay sử dụng máy công ty, máy tính ở nhà muốn VSCode sync mấy cái extention hay sử dụng
Cần có
Tài khoản Github, danh sách extension sẽ được lưu lên gist
Cài thêm extention tên là Settings Sync – tác giả Shan Khan.
Tạo access token trên Github
Đăng nhập vào tài khoản Github, vào trang Settings / Developer settings / Personal access tokens / Generate New Token
Nhập tên và cấp quyền tạo gist cho token này
Sau khi tạo xong, nhớ lưu lại token này ở đâu đó
Upload những thiết đặt, extensions đã cài cho VSCode
Dùng phím tắt Shift + Alt + U hoặc search từ command Palette, search từ sync
Nó sẽ yêu cầu nhập giá trị token vừa mới tạo
Sau khi upload thành công, nó sẽ trả về gist id, nhớ copy và lưu lại giá trị gist Id này để sử dụng trên máy khác.
Download các thiết từ gist về
Dùng phím tắt Shift + Alt + D, hoặc gọi từ command palette
Nó sẽ yêu cầu nhập lại token và gist id đã tạo, điền vào, xong!
Giá trị count được lưu trong state của component Counter
Khi user click ‘+’, hàm increment sẽ tăng giá trị count lên
Khi state bị thay đổi, React sẽ render lại Counter và những component bên trong của nó, giá trị mới sẽ hiển thị
Thêm Redux
Như đã đề cập trong tuts trước, Redux lưu state lại trong 1 cái store, tranh lẫn lộn, store là nơi lưu state, và state dữ liệu.
Cài redux và react-redux package
npm install redux react-redux --save
Tại sao phải 2 cái package?, cái redux chỉ cho ta cái store, để lấy được cái state ra, sử dụng hàm connect trong react-redux, vì redux không phải chỉ làm việc chung được với React thôi không, nó có thể chơi với Vue, Angular không chừng.
Vẫn chưa đủ, thật sự Redux không được thông minh như chúng ta tưởng tượng, lúc đầu mình đã nghĩ rằng khi create store như vậy nó sẽ cho mình những giá trị default bên trong store. Nhưng không chúng ta phải làm tay tất cả. Chúng ta phải cung cấp cho nó 1 hàm gọi là reducer, cái hàm reducer này phải return về một giá trị cho state, luôn phải return state nhé. Bên trong reducer ta sẽ xào nấu state theo yêu cầu, nó sẽ nhận state hiện tại và trả về state mới.
Action là gì, nó đóng vai trò như thế nào và nó đến từ đâu? Làm thế nào mà ta đổi giá trị counter?
action là 1 JS object nó sẽ cho biết bạn đang muốn order món nào, như tờ giấy ghi order trong nhà hàng ấy mà, nó sẽ chưa thông tin ‘món’ bạn order, đầu bếp reducer sẽ dựa vào đó mà xào nấu ra ‘món’ bạn order
Reducer sẽ căn cứ vào action.type để thực hiện thay đổi và trả về state mới, nên nhớ chúng ta phải LUÔN LUÔN trả về state trong reducer, nếu có hay không có thay đổi cũng phải trả về state
Không bao giờ được phép thay đổi State trực tiếp
State là một immutable object, tuyệt đối KHÔNG thay đổi state như sau
function brokenReducer(state = initialState, action) {
switch(action.type) {
case 'INCREMENT':
// BẬY: đừng thay giá trị bằng kiểu này
state.count++;
return state;
case 'DECREMENT':
// BẬY: đừng thay giá trị bằng kiểu này
state.count--;
return state;
default:
return state;
}
}
Làm như vậy cũng cấm tuyệt đối nhé:
state.foo = 7
state.items.push(newItem)
delete state.something
Action từ đâu mà có
Action không tự sinh ra, nó được dispatch ra từ hàm dispatch. Hàm dispatch thì đặc biệt là nó không được import, mình có thể gọi store.dispatch(someAction), nhưng cái store này thì nó năm ở trong 1 file thôi, Vậy hàm dispatch này làm sao có đây?
Thật ra lúc chúng ta gọi connect thì hàm connect cũng đã map cái hàm dispatch vào trong props của component luôn.
Sau những năm mòn mông trên ghế nhà trường, chắc hẳn ai cũng có mong muốn có được công việc ổn định, lo được cuộc sống hiện tại và tương lai. Nhưng đường đời không hề bằng phẳng, ra trường bạn mang một nhiệt huyết muốn cống hiến muốn làm đúng chuyên ngành để phát triển bản thân nhưng rồi tình trạng chung lại xuất hiện, gửi CV nhiều nơi nhưng không có nơi nào gọi.
Bạn không biết vì sao, bạn không biết bạn thiếu gì thì hãy đoc bài viết này góp phần hỗ trợ các bạn sinh viên IT cách nhìn nhận lại cái mình còn thiếu và cần trang bị những gì khi tìm kiếm công việc.
Kiến thức
Đây là điều tiên quyết bạn cần có khi tìm kiếm công việc. Kiến thức sẽ là yếu tố để nhà tuyển dụng nhìn nhận những yếu tố bên ngoài của bạn để xem xét bạn phù hợp không. Ví dụ bạn là lập trình PHP nhưng công ty bạn mong muốn làm thì lại tuyển Java thì bạn đã vào thế yếu rồi. Nhưng nếu như bạn chưa tích lũy đủ thì cũng đừng quá băn khoăn, bạn vẫn có cơ hội update kiến thức dần dần, miễn là trong chính bản thân bạn có động lực thúc đẩy bạn làm điều đó.
Ngoại ngữ là một trong những yếu tố cần thiết đối với ngành IT ngoài kỹ năng chuyên môn. Hầu hết các tài liệu nghiên cứu về ngành IT đều bằng tiếng Anh, vì công nghệ nước ngoài đi trước chúng ta, công nghệ tại Việt Nam mới kế thừa và phát triển sau này nên tài liệu mang tiếng Việt khá ít mà thường biên dịch từ tài liệu nước ngoài. Nhưng việc biên dịch cũng có hạn chế vì người ta sẽ dịch dựa trên góc nhìn và độ hiểu của người dịch, có thể vô tình câu từ gây khó hiểu. Nên việc hiểu biết về tiếng Anh sẽ giúp bạn vừa hiểu tường tận kiến thức chuyên môn, vừa cải thiện khả năng tiếng Anh
Bạn đầu tư cho bản thân nhưng đó là những thứ vô hình, khó nhìn thấy, nhà tuyển dụng sẽ rất khó để biết bạn có gì trong mình nên hồ sơ xin việc là công cụ giúp bạn hữu hình hoá những cái bạn đang có, những cái bạn muốn show ra để thấy bạn là người phù hợp.
Tuỳ nơi mà có quy định riêng về hồ sơ xin việc khác nhau, nhưng cơ bản có những yếu tố sau đây: sơ yếu lý lịch, đơn xin việc, CV, giấy khám sức khỏe, bằng cấp – chứng chỉ.
Nhưng có lẽ điều bạn băn khoăn là không biết viết gì trong CV để phù hợp?
Hiện tại trên mạng có rất nhiều template CV sẵn, tha hồ bạn lựa chọn, nhưng template chỉ là yếu tố phụ thôi, quan trọng là nội dung của CV.
“Để thu hút nhà tuyển dụng thì ứng viên nên nhấn mạnh giá trị mình đem đến cho công ty, cũng như chứng minh được bản thân có khả năng giải quyết vấn đề tốt qua những kinh nghiệm làm việc. Còn technology thì không thực sự cần thiết vì mỗi công ty sẽ có technology riêng của họ”).
– Anh Hiếu Phạm – Senior Software Engineer tại Rockset
Để hết tất cả những project bạn từng tham gia vào trong CV, điều đó cũng được thôi nhưng quan trọng với mỗi project bạn học được gì. Nhà tuyển dụng khi nhìn vào những project bạn làm sẽ nghĩ bạn có kinh nghiệm và kỹ năng, và đó là điểm cộng so với những ứng viên khác. Nhưng điều quan trọng hơn là nhà tuyển dụng cần biết bạn học được điều gì với mỗi project.
Có những bạn sinh viên tham gia project thì nhiều nhưng cuối cùng lại là “cái đầu rỗng”, đến khi hẹn ứng viên phỏng vấn mới phát hiện ra. Thế nên để tránh làm mất thời gian của nhau thì bạn nên ghi tóm tắt những điều mình làm và học được sau mỗi project, mô tả khái quát về dự án đó làm gì, công nghệ như thế nào, bạn thực hiện công việc chính gì trong project đó.
Khi gần ra trường hay trước học kỳ đi thực tập, các bạn nên dành ra một chút thời gian, chủ động đi tìm việc. Với sự phát triển của Internet hiện nay thì không quá khó khi tìm kiếm, chỉ cần search keyword một cách tối ưu sẽ giúp bạn tìm kiếm hiệu quả hơn, hoặc các bạn có thể lên các trang confession để hỏi các anh chị đi trước.
Vậy chủ động tìm kiếm điều gì về công ty, nơi bạn muốn làm việc? Bạn nên tìm hiểu về văn hóa, chế độ đãi ngộ, tầm nhìn phát triển của công ty. Bạn so sánh các điều đó với career path của bạn, nếu phù hợp thì đó là nơi dành cho bạn. Ngoài ra, khi bạn tìm hiểu những thông tin trên từ trước, đó sẽ là điểm cộng khi bạn đi phỏng vấn.
Nhiều lúc chắc bạn tự hỏi sao gửi CV nhiều nơi mà không thấy công ty nào gọi hẹn lịch. Có nhiều nguyên nhân dẫn đến trường hợp này, một trong số đó là bạn lựa chọn công ty ứng tuyển chưa phù hợp với năng lực, nhà tuyển dụng họ thường xem xét tuyển người phù hợp hơn là người giỏi.
Bạn thử hình dung, nếu một người giỏi vào công ty nhưng tinh thần làm việc trì trệ, nghĩ mình giỏi và xem thường đồng nghiệp thì tuyển vào rất lãng phí. “Một cây làm chẳng nên non, ba cây chụm lại nên hòn núi cao”, trong công việc “đơn phương độc mã” thì công việc không hiệu quả được, nếu tuyển người như trên thì teamwork cũng rất khó. Ông bà ta có câu “biết mình biết ta, trăm trận trăm thắng” là vậy, hiểu bản thân mình, hiểu nhà tuyển dụng chắc chắn bạn sẽ thu hút được mọi nhà tuyển dụng hướng đến bạn.
Thời điểm mới ra trường đa số các bạn đều muốn lương cao, đãi ngộ tốt, đòi hỏi rất nhiều từ nhà tuyển dụng để xứng đáng với 4 năm đại học, nhưng cũng vì thế mà bạn gặp khó khăn trong quá trình tìm việc. Đừng nên đòi hỏi mà thay vào đó, bạn hãy lựa chọn những công việc training on job, cũng sẽ là cơ hội cho bạn tích lũy kinh nghiệm và nâng cao năng lực trước khi cập bến tại một công ty to lớn hơn, nơi mà bạn ao ước.
Có người thì lo lắng quá trước khi đi phỏng vấn, có bạn thì lại không, nhưng lời khuyên mình dành cho các bạn là nên chuẩn bị kỹ trước cho buổi phỏng vấn. Vậy chuẩn bị gì, mong là một số lời khuyên bên dưới giúp ích cho bạn.
Ôn lại kiến thức mà phía nhà tuyển dụng yêu cầu, chúng được đề cập trong mô tả công việc. Bạn có thể tham khảo các câu hỏi mẫu, phổ biến mà tuyển dụng hay dùng, điều này sẽ giúp bạn cảm thấy tự tin hơn, tránh bị lúng túng.
Chuẩn bị kỹ càng mọi hồ sơ cần thiết.
Tập thử trước gương hoặc soạn sẵn ra những câu hỏi, tự trả lời trước gương, chỉnh sửa tác phong, điều này giúp bạn tạo nên sự tự tin và cách nói chuyện thật tốt.
Trong quá trình phỏng vấn
Dù chuẩn bị kỹ càng cỡ nào thì khi đi phỏng vấn cũng không biết chuyện gì xảy ra để lường trước được, nhưng bạn cần lưu ý những điểm sau đây:
Bình tĩnh trong quá trình phỏng vấn, mất bình tĩnh sẽ ảnh hưởng đến kết quả phỏng vấn.
Trang phục lịch sự, nói chuyện âm lượng vừa đủ nghe, khi bước vào phỏng vấn nên cúi đầu nhẹ và chào, sẽ giúp bạn bước đầu ghi điểm trong mắt nhà tuyển dụng và cũng khiến bạn cảm thấy thoải mái, không bị quá áp lực với bầu không khí căng thẳng lúc đó.
Khi trả lời phỏng vấn, nếu không biết thì hãy thành thật. Nhà tuyển dụng sẽ biết bạn nói xạo ngay thông qua một số câu hỏi vì đó là nghề của họ. Không nên nói thẳng thừng là “Em không biết!” mà nên trả lời khéo léo, ví dụ như “vấn đề này em chưa có cơ hội tìm hiểu qua, em sẽ tìm hiểu trong thời gian tới’.
Hãy luôn thể hiện mình là một người có tinh thần học hỏi, không ngại khó, không ngại khổ; cố gắng thể hiện năng lượng và tinh thần làm việc nhóm.
Hãy nói lên mong muốn của bạn, mong muốn được có cơ hội thử sức làm viêc tại công ty, bên cạnh đó thể hiện đam mê và trách nhiệm với công việc.
Bạn cũng có thể tham khảo các bài phỏng vấn mẫu để rút ra bài học cho bản thân và áp dụng khi đi phỏng vấn.
Bài viết dựa trên góc nhìn của bản thân, nếu còn thiếu sót mong các bạn thông cảm và góp ý với mình nhé! Hi vọng trong tương lai, bài viết sẽ góp phần giúp các bạn tự tin tiếp bước trên con đường lập nghiệp.
Ngoài ra với các bạn sinh viên đang tham khảo vị trí tuyển dụng từ các công ty ngành cntt. Tham khảo ngay các việc làm it như fresher business analyst, fresher net, fresher nodejs,….. apply ngay!
Bạn luôn trong trạng thái không biết sẽ làm gì và bắt đầu từ đâu trong công việc? Các công việc cứ chồng chéo lên nhau và bạn không biết phải làm việc nào trước. Và nhiều vấn đề khác liên quan đến lập kế hoạch trong học tập, làm việc hoặc kinh doanh. Bài viết này là dành cho bạn, TopDev sẽ giúp bạn tìm hiểu các phương pháp giúp xác định rõ nội dung công việc một cách hiệu quả. Đó là 3 nguyên tắc 5W1H, 5W2H và 5W1H2C5M.
Nguyên tắc 5W1H
5W gồm WHO, WHAT, WHEN, WHERE, WHY và 1H là HOW.
Mỗi từ trong 5W1H đại diện cho một câu hỏi căn bản:
What (Cái gì): Điều gì đã xảy ra? Vấn đề là gì?
Why (Tại sao): Tại sao điều này xảy ra? Nguyên nhân là gì?
Who (Ai): Ai là người liên quan hoặc chịu trách nhiệm?
Where (Ở đâu): Điều này xảy ra ở đâu? Bối cảnh nào?
When (Khi nào): Thời gian xảy ra sự việc là khi nào?
How (Như thế nào): Điều này diễn ra như thế nào? Quá trình ra sao?
Why – Mục tiêu và công việc nào cần thực hiện
Why giúp bạn đặt ra những thắc mắc đầu tiên trước khi tiếp tục các giai đoạn kế tiếp. Đây cũng được xem là rào cản và cũng là thách thức mà bạn cần vượt qua.
Hãy trả lời các câu hỏi sau đây để tự nhận định rằng mình có mục tiêu rõ ràng hay chưa:
Tại sao bạn phải làm công việc này?
Nó có ý nghĩa như thế nào đối với bộ phận, tổ chức của bạn?
Nếu không thực hiện, nó có dẫn đến những ảnh hưởng nào hay không?
Nhiều người gặp khó khăn và đã thất bại trong khi trải nghiệm Why. Điều này dễ hiểu vì bản thân họ chưa biết họ muốn điều gì. Vì thế, các bạn hãy thật sự tập trung để xác định mục tiêu, yêu cầu công việc một cách cụ thể. Điều này có ý nghĩa lớn vì nó sẽ là kim chỉ nam giúp bạn luôn hướng về mục tiêu ban đầu đồng thời việc đánh giá kết quả đạt được sẽ chính xác hơn.
What – Xác định nội dung công việc cụ thể là gì?
Sau khi đã vạch rõ mục tiêu, yêu cầu công việc, bước tiếp theo là bạn sẽ lên những nội dung hoạt động cụ thể hơn.
Chằng hạn, khi xác định được mục tiêu là cần đạt được 300 CV trong vòng 1 tuần, bạn sẽ chia nhỏ ra những đầu công việc ứng với từng nhiệm vụ. Đó có thể là thông tin về vị trí ứng tuyển, tìm kiếm khai thác và khoanh vùng những ứng viên tiềm năng, lập hồ sơ liên hệ và trao đổi với các đối tác để có nguồn dữ liệu về các ứng viên đủ tiêu chí,…Và một điều quan trọng là đừng quên bám sát vào mục tiêu đề ra, tránh đi lạc hướng so với những dự định ban đầu.
Where, When, Who – Địa điểm, thời gian, nguồn lực nhân sự
Các câu hỏi thuộc nhóm 3W (Where, When, Who) giúp xác định bối cảnh, thời gian và đối tượng liên quan đến một vấn đề cụ thể. Dưới đây là mô tả chi tiết và ví dụ cho từng câu hỏi Where, When, và Who.
Where (ở đâu?)
Câu hỏi “Where?” được sử dụng để xác định địa điểm hoặc bối cảnh nơi một sự kiện, hành động, hoặc vấn đề xảy ra. Nó giúp làm rõ vị trí địa lý hoặc bối cảnh cụ thể liên quan đến tình huống đang được xem xét.
Ví dụ các câu hỏi:
Sự kiện này diễn ra ở đâu?
Nơi làm việc của bạn ở đâu?
Cuộc họp được tổ chức ở phòng nào?
Dự án này sẽ được triển khai ở địa phương nào?
Tài liệu này được lưu trữ ở đâu?
When (khi nào?)
Câu hỏi “When?” được sử dụng để xác định thời gian hoặc mốc thời gian mà một sự kiện hoặc hành động xảy ra. Việc trả lời câu hỏi này giúp làm rõ khung thời gian liên quan đến sự kiện hoặc hành động đó.
Ví dụ các câu hỏi:
Khi nào cuộc họp bắt đầu?
Dự án này sẽ hoàn thành vào thời gian nào?
Bạn đã gặp khách hàng lần đầu tiên khi nào?
Khi nào bạn bắt đầu công việc này?
Sản phẩm sẽ được ra mắt vào khi nào?
Who (ai?)
Câu hỏi “Who?” được sử dụng để xác định người hoặc nhóm người có liên quan đến một sự kiện, hành động, hoặc tình huống cụ thể. Nó giúp làm rõ danh tính của các cá nhân hoặc tổ chức liên quan.
Ví dụ các câu hỏi:
Ai là người chịu trách nhiệm cho dự án này?
Ai sẽ tham gia cuộc họp ngày mai?
Bạn đã làm việc với ai trong dự án này?
Khách hàng chính của chúng ta là ai?
Ai là người phát biểu trong buổi lễ?
How – Cách thức để thực hiện nhiệm vụ
Ở bước này, hiểu đơn giản là người lập kế hoạch cần chỉ ra được những cách thức thực hiện công việc.
Cụ thể, cần thông tin cho những cộng sự về các nguồn tài liệu có liên quan, thiết bị nào cần được trang bị nhằm phục vụ tốt quá trình thực hiện công việc, cách vận hành các thiết bị, máy móc hoặc đề ra những tiêu chuẩn đánh giá về chất lượng công việc.
Nguyên tắc 5W2H
Nguyên tắc 5W2H, gần giống với 5W1H chỉ khác là có thêm 1H nữa là How much/How many – Chi phí là bao nhiêu? Số lượng là bao nhiêu? Mức độ ảnh hưởng ra sao?
5W2H đi sâu hơn vào chi tiết bằng cách bổ sung phân tích về khía cạnh định lượng, như chi phí, số lượng, mức độ giúp bạn có cái nhìn chi tiết hơn, đặc biệt là trong việc lập kế hoạch và quản lý dự án. Ví dụ các câu hỏi như Chi phí cho dự án này là bao nhiêu? Lợi nhuận dự kiến là bao nhiêu? Bao nhiêu thời gian sẽ cần để hoàn thành nhiệm vụ này?
Phương pháp 5W1H2C5M
Nhìn vào các chữ cái viết tắt, chúng ta dễ dàng nhận thấy 5W1H2C5M là cải tiến từ 5W1H với phần bổ sung là 2C và 5M. Cùng xem các chữ cái này có ý nghĩa gì nhé!\
2C – Control, Check
Trong phương pháp 5W1H2C5M, 2C đại diện cho hai yếu tố quan trọng: Control (Kiểm soát) và Check (Kiểm tra). Cả hai yếu tố này đều liên quan đến việc đảm bảo rằng một dự án hoặc quy trình được thực hiện theo đúng kế hoạch, đạt được các tiêu chuẩn chất lượng, và đáp ứng các yêu cầu đã đề ra.
Control – Kiểm soát hoạt động
Bất kỳ một công việc nào khi thực hiện cũng cần phải được tiến hành kiểm soát và đo lường. Chính vì vậy, để việc theo dõi và đo lường phạm vi hoạt động hiệu quả, bạn cần đề cập đến một số yếu tố sau:
Đơn vị đo lường cho công việc này là gì?
Những thông số khoa học nào phản ánh đầy đủ khả năng và phạm vi hoạt động của công việc?
Vấn đề nào/Điều gì cần kiểm soát và theo dõi xuyên suốt?
Check – Kiểm tra, đánh giá quá trình và hiệu suất
Đây là một bước khá quan trọng và cần được tuân thủ theo nguyên tắc Pareto: Cơ chế của nguyên tắc này là chỉ kiểm tra 20% mức độ hiệu quả ban đầu của quá trình thực hiện nhiệm vụ. Trong khi đó, 80% sẽ tập trung vào những sai sót phát sinh.
Để công đoạn kiểm tra và đánh giá quá trình đạt được hiệu quả như mong muốn, người quản lý cần xác định những nội dung như sau:
Những bước nào cần tiến hành kiểm tra, theo dõi
Tần suất kiểm tra là bao lâu? (dựa vào tính quan trọng của từng giai đoạn thực hiện)
Những điểm nào là trọng yếu trong quá trình đánh giá
5M – Xác định nguồn lực thực hiện nhiệm vụ
5M là viết tắt của Man, Money, Material, Machine, Method, đây là năm yếu tố chính ảnh hưởng đến sản xuất và quản lý, thường được sử dụng trong phân tích và cải tiến quy trình.
Man – Nguồn nhân lực: Người giữ trách nhiệm thực hiện công việc có đủ mức độ phù hợp với công việc thông qua các tiêu chí về: trình độ, kỹ năng, kinh nghiệm, phẩm chất,…
Money – Ngân sách: Nguồn quỹ thực hiện những công việc này là bao nhiêu? Và kỳ hạn giải ngân sẽ được tiến hành trong bao lâu?
Material – Hệ thống cung ứng phục vụ kế hoạch nhân sự: Tiêu chuẩn để trở thành nhà cung ứng cho việc là gì?
Machine – Máy móc/công nghệ kỹ thuật: Mức độ tương đồng giữa các thiết bị công nghệ kỹ thuật có phù hợp với nhu cầu thực hiện nhiệm vụ không? Những phương pháp về công nghệ nào cần được áp dụng để thực hiện công việc?…
Method – Phương pháp làm việc: Cách vận hành hoạt động nhân sự như thế nào?
Nguyên tắc 5W – H – 2C – 5M được thể hiện dưới nhiều hình thức khác nhau và trên thực tế khi áp dụng, với kinh nghiệm vốn có của mình, nhà quản lý sẽ linh hoạt sao cho nguyên tắc này đảm bảo được tính hiệu quả nhất cho tổ chức của mình.
3 phương pháp 5W1H – 5W2H – 5W1H2C5M là công cụ mạnh mẽ giúp bạn phân tích, lập kế hoạch, và quản lý các dự án hoặc quy trình một cách hiệu quả. Hi vọng qua bài viết của TopDev đã giúp bạn biết cách áp dụng các nguyên tắc phù hợp với bản thân.
Gọn gàng sạch sẽ hơn, tuy nhiên cũng đừng lạm dụng quá, có anh bạn làm chung với mình, lạm dụng cách này quá lố, đến nổi mỗi lần đọc code của anh ấy là cơn ác mộng, mặc dù không sai, nhưng thằng nào code sau mở lên đọc tội nó lắm.
Trong trường hợp trên, rõ ràng việc trả về null cũng hơi dư thừa, có thể sử dụng ngắn-hơn-cả-ngắn với cú pháp &&. Cũng như câu điều kiện rút gọn, tuy nhiên nó sẽ chỉ render nếu true, con false nó sẽ không làm gì cả
IIFE như tên gọi nó đã nói lên tất cả, hàm sẽ thực thi ngay khi nó được định nghĩa.
Bình thường
function myFunction() {
// ...
}
myFunction();
Để biến nó thành IIFE, convert nó qua thành một expression
(function myFunction(/* tham số*/){
// ...
}( /* tham số*/ ));
// viêt như vầy cũng được nha
(function myFunction(/* tham số*/){
// ...
})( /* tham số*/ );
// hoặc bỏ luôn tên
(function(/* tham số*/){
// ...
})( /* tham số*/ );
// hoặc dùng luôn arrow function cho máu
((/* tham số*/) => {
// ...
})( /* tham số*/ );
Nếu thấy dùng IFEE có vẻ hơi khó chịu, chúng ta đang làm React, tất cả hãy đưa về component, tách phần logic của component và phần render cái view ra luôn là đều được khuyến cáo, declarative vs. imperative programing
Vậy nên chuyển các điều kiện này sang một sub component để render dựa trên props luôn là ý hay.
create-react-app react-auth
cd react-auth
npm i react-router-dom glamor --save
Cài AWSMobile CLI
npm i -g awsmobile-cli
Khởi tạo config AWS IAM
awsmobile configure
awsmobile init
Nó sẽ tạo project Mobile Hub và file aws-exports.js trong thư mục src. Tiếp theo, thêm user-signin và deploy các config mới
awsmobile user-signin enable
awsmobile push
awsmobile user-signin enable sẽ bật Amazon Congito trong project với các thiết đặt mặc định, bao gồm 2 factor authentication với SMS (sẽ thêm TOTP sau). Nếu muôn can thiệp các thiệt đặt, vào trực tiếp Amazon Cognito để chỉnh
Màn hình đăng ký
Để tương tác với Amazon Cognito, chúng ta sẽ sử các hàm trong class Auth từ thư viện aws-amplify:
// một số import khác
//
import config from './aws-exports'
import Amplify from 'aws-amplify'
Amplify.configure(config)
ReactDOM.render(<App />, document.getElementById('root'))
registerServiceWorker();
Flow sẽ như thế này, sau khi user cung cấp các thông tin trong form signup, chúng ta gọi đến phương thức signUp, user sẽ nhận được một mã code để verify quá SMS, user điền mã code này vào form verify, chúng ta verify cái mã code này bằng phương thức ‘confirmSignUp’
Cuối cùng import và sử dụng component trong App.js
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import SignUp from './SignUp'
class App extends Component {
render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h1 className="App-title">Welcome to React</h1>
</header>
<SignUp />
</div>
);
}
}
export default App;
Các thông tin của user sẽ được lại trong ‘Manage your User Pools’, vào Amazon Coginito dashboard, chọn ứng dụng đã setup, chọn mục ‘Users and Settings’
Sign In
Sign in thì cũng tương tự như signup, chúng ta sử dụng Auth.signIn(username, password), trả về object nếu thành công, sau đó nó sẽ gửi SMS tới user với code xác nhận lần nữa, verify bằng confirmSignIn
Trong xu thế phát triển chung của ngành nhân sự, nhiều nhà quản lý rất xem trọng yếu tố con người và vì thế họ trao quyền cho các nhân viên về việc tự đánh giá và viết bản đánh giá về hiệu suất làm việc của mình.
Đây là cơ hội để nhân viên tự phản ánh và phân tích lại những điểm mạnh và điểm yếu của họ là gì, tự đánh giá không chỉ quan trọng đối với sự phát triển mà nó còn cung cấp một cơ hội để phản hồi cho các nhà quản lý về những gì cần thúc đẩy, khuyến khích nhân viên làm việc tốt hơn. Bài viết sau đây sẽ giúp bạn giải quyết những khó khăn trong việc viết bản tự đánh giá.
Một mục tiêu chính của việc tự đánh giá là làm nổi bật những thành tựu và nhớ lại các mốc quan trọng trong sự phát triển chuyên nghiệp của bạn. Một bản tự đánh giá tốt nên chỉ ra các dự án và nhiệm vụ cụ thể nhằm làm nổi bật công việc tốt nhất của bạn. Khi mô tả những thành tựu đó, nhân viên nên nhấn mạnh tác động của những kết quả đối với toàn bộ doanh nghiệp của mình. Nếu những chia sẻ càng chi tiết và sâu sắc, nhà quản lý sẽ có thể nhận thấy được nhiệt huyết của bạn dành cho công việc đồng thời họ cũng nắm bắt được bạn đã đóng góp những giá trị nào cho công ty.
Bạn nên cố gắng kết nối hành động của mình với các mục tiêu của người quản lý. Điều này khiến các nhà quản lý đánh giá cao năng lực của bạn vì bạn đã được hiểu vai trò của mình trong bối cảnh phát triển của công ty.
2. Hãy trung thực!
Tự đánh giá không đơn giản là cứ tập trung vào những thành tích tốt.
Hãy thành thật chia sẻ những thiếu sót của bạn trong quá trình thực hiện nhiệm vụ. Bạn chia sẻ không phải tự chê trách mình mà là đang tự nhìn nhận lại và rồi tự tạo sự cam kết với bản thân mình sẽ nỗ lực hơn để thay đổi, khắc phục những hạn chế đó.
Nhận ra sai sót riêng giúp bạn có nhiều trải nghiệm hơn trong công việc của mình khi mỗi lần vấp ngã đều cho bạn những bài học giá trị và khiến bạn mạnh mẽ hơn. Điều này cũng có tác động lớn đến khả năng học hỏi và phát triển của bạn sau này. Trung thực trong việc tự phê phán bản thân là một yếu tố giúp các nhà quản lý khoanh vùng và tuyển chọn những nhân viên tiềm năng trong tổ chức/ doanh nghiệp.
3. Hãy chuyên nghiệp trong việc tự đánh giá
Đơn giản thì điều này có nghĩa là không nên đánh giá sếp về những kỹ năng lãnh đạo của họ hoặc chỉ trích, phê phán đồng nghiệp vì làm ảnh hưởng đến hiệu suất công việc của bạn khi có cơ hội công tác chung một team.
Ngoài ra, các nhân viên không nên bày tỏ quan điểm theo cách quá chủ quan về một người quản lý hoặc đồng nghiệp mà bạn thật sự thích. Và cho dù bạn đang truyền tải một phản hồi tích cực hay tiêu cực thì việc duy trì sự chuyên nghiệp là điều đáng phải lưu tâm.
Bạn nên tự đánh giá bản thân giống như một tác phẩm nghệ thuật được xây dựng theo thời gian. Bạn sẽ hạnh phúc hơn nhiều với kết quả mình đạt được nếu bạn biết cách truyền tải nó một cách chuyên nghiệp với nhà quản lý và các cộng sự. Hãy cẩn trọng trong việc tự đánh giá bản thân mình khi nói (thông qua phát ngôn) và khi viết (thông qua từng con chữ).
4. Không ngừng phấn đấu để phát triển
Một điều quan trọng trong quá trình tự đánh giá là không bao giờ trì trệ. Điều đó đồng nghĩa bạn cần phải luôn trong tâm thế sẵn sàng thích nghi với cái mới, không ngừng học hỏi và phát triển mình. Hãy dành một chút thời gian để liệt kê các mục tiêu của bạn cao hơn cho năm tới trong quá trình tự đánh giá của bạn. Tất nhiên, bạn vẫn phải đảm bảo rằng những dự định mà bạn sẽ phấn đấu đạt được tiếp theo phải có tính khả thi.
“Chúng ta nên áp dụng tư duy tăng trưởng trong quá trình phát triển sự nghiệp bản thân. Hãy hiểu rằng tiềm năng con người là không giới hạn và tùy thuộc vào từng khả năng, mức độ phù hợp với môi trường sống và làm việc, bạn có thể đặt ra những mục tiêu phấn đấu xa hơn. Đừng quá khuôn khổ để rồi trở nên lạc lõng trong việc dậm chân tại chỗ. Hãy phá bỏ rào cản về sự cố gắng của hiện tại và không ngừng hoàn thiện, chinh phục mục lớn hơn là cách bạn cho nhà quản lý thấy, bạn thật sự tài giỏi.”
Chia sẻ từ David Hassell – một doanh nhân thành đạt đồng thời cũng là CEO của 15Five.
5. Theo dõi thành tích của bản thân
Khi đến lúc thảo luận về những thành tựu của bạn trong việc tự đánh giá, việc bạn cung cấp dữ liệu cứng để cho thấy những gì bạn đã làm trong suốt quá trình thực hiện công việc là điều rất quan trọng. Điều này cho thấy bạn thật sự quan tâm đến hiệu suất công việc vì đã theo dõi mức độ hoạt động của của chúng.
Những số liệu cụ thể, chính xác mà bạn thống kê và phân tích được từ việc theo dõi diễn tiến công việc hàng ngày, hàng tuần, hàng tháng,.. sẽ là minh chứng đáng tin cậy để nhà quản lý đánh giá cao sự nỗ lực của bạn. Không những thế, việc theo dõi số liệu còn giúp bạn nhận ra những những sai sót từ đó, bạn có thể đánh giá và đưa ra những góp ý, đề xuất về cách tổ chức, sắp xếp công việc, phương án và nguồn lực thực hiện,…
“Các nhân viên họ nên dành ra 10 phút mỗi ngày để theo dõi, ghi nhận những thay đổi về khả năng hoạt động thông qua các số liệu đạt được để tự đánh giá và phản hồi mỗi ngày. Theo đó, nguồn dữ liệu sẽ tăng lên gấp nhiều lần sau một tháng, một quý hay một năm. Lúc này, họ có thể đưa ra những đánh giá chuyên sâu hơn về tính hiệu quả của công việc thậm chí là cơ chế vận hành và quy mô hoạt động của cả tổ chức.”
ChMike Mannon , Chủ tịch của WD Communications chia sẻ.
Đánh giá hiệu suất định kỳ là một nhiệm vụ quan trọng để các nhà quản lý và nhân viên xem xét những gì đã diễn ra trong quá trình vận hành công việc và thảo luận về những kỳ vọng tiến về phía trước. Một đánh giá có ý nghĩa như một cơ hội để thiết lập mục tiêu của cá nhân và tập thể. Hãy ghi nhớ những lời khuyên trên để có thể tự tin hơn trong việc tự đánh giá hiệu suất làm việc của chính mình.
Một bài viết tổng hợp, sẽ cố gắng đề cập càng nhiều càng tốt các vấn đề có thể gặp khi đụng đến unit test với React.
Tại sao phải test?
Rất hiển nhiên là chúng ta viết test nhằm mục đích hạn chế được càng nhiều lõi càng tốt, đảm bảo những gì chúng ta viết ra chạy đúng như chúng ta mong muốn. Một vài điểm trừ khi chúng ta phải viết test
Là nó tốn thời gian và tương đối khó khăn (dù là lập trình viên kinh nghiệm cũng gặp không ít vất vả khi mới bắt đầu viết test)
Test pass không có nghĩa ứng dụng, function của chúng ta chạy đúng 100%
Cũng đôi khi, test fail, nhưng ứng dụng, function vẫn chạy hoàn toàn bình thường
Trong vài trường hợp đặc biệt, chạy test trong CI có thể tốn tiền
Test các chức năng, function của ứng dụng, những cái mà user sẽ sử dụng. Nó giúp chúng ta tự tin vỗ ngực, ứng dụng đáp ứng đúng nhu cầu sử dụng
Không test cái gì
Thích quan điểm của Kent C về việc không nên đi quá chi tiết việc hiện thực. Việc mà code nó hiện thực như thế nào chúng ta không quan tâm, user không quan tâm, chúng ta chỉ quan tâm đầu vào-đầu ra của một function.
Các thư viện của người khác viết cũng là thứ không cần thiết phải test, nó là trách nhiệm của người viết thư viện. Nếu không tin thì đừng dùng nó. Còn nếu thật sự có tâm bạn hãy hỗ trợ cho thư viện đó trên github bằng cách bổ sung test cho nó.
Một vài triết lý cá nhân khi test
Nhiều integration test, không dùng snapshot test, vài unit test, vài e-to-e test.
Hãy viết thật nhiều integration test, unit test thì tốt nhưng nó không thật sự là cách mà người dùng sử dụng ứng dụng. Việc test chi tiết code hiện thực ra sao với unit test rất dễ.
Integration test nên dùng mock (dữ liệu giả lập) ít nhất có thể
Không nên test những cái tiểu tiết như tên hàm, tên biến, cách khai báo biến số, hằng số có hợp lý.
Lấy ví dụ, nếu chúng ta test một button và thay đổi tên function xử lý onClick từ increment sang handleClick, test sẽ fail nhưng mọi thứ vẫn hoạt động bình thường.
Shallow vs mount
Mount là phần html, css, js thật sự khi chạy, như cách mà browser sẽ thấy, nhưng theo cách giả lập. Nó không có render, paint bất cứ thứ gì lên UI, nhưng làm như thể nó là browser thật sự và chạy code ngầm bên dưới.
Không bỏ thời gian ra để paint ra UI giúp test chạy nhanh hơn. Tuy nhiên nó vẫn chưa nhanh bằng shallow render
Đó là lý do bạn phải unmount và cleanup sau mỗi test, nếu không test này sẽ gây side-effect lên test kia.
Mount/render thường được sử dụng cho integration test và shallow sử dụng cho unit test.
Kiểu shallow render sẽ chỉ render ra một component đang test mà không bao gồm các component con, như vậy để tách biệt việc test trên từng component độc lập.
import React from 'react'
import ReactDOM from 'react-dom'
import Basic from '../basic_test'
import Enzyme, { shallow, render, mount } from 'enzyme';
import toJson from 'enzyme-to-json'
import Adapter from 'enzyme-adapter-react-16'
Enzyme.configure({ adapter: new Adapter() })
3 cái import đầu tiên là cho React và component đang test, sau đó đến phần của Enzyme, toJson là để chuyển shallow component của chúng ta ra thành JSON để lưu thành snapshot
Cuối cùng là Adapter để làm việc được với react 16
Thực hiện test chi tiết với Enzyme
Chúng ta sẽ lấy một ví dụ tại sao ko nên test việc hiện thực chi tiết, với một component <Counter /> như thế này
import React, { Component } from 'react'
class Counter extends Component {
constructor(props) {
super(props)
this.state = {
count: 0
}
}
increment = () => {
this.setState({count: this.state.count + 1})
}
// đoạn code này mặc dù ko đúng, nhưng khi test vẫn cho kết quả pass
// <button onClick={this.incremen}>
// Clicked: {this.state.count}
// </button>
render() {
return (
<div>
<button className="counter-button" onClick={this.incremen}>
Clicked: {this.state.count}
</button>
</div>
)}
}
export default Counter;
Trong component trên, chúng ta cố tình gõ sai chữ incremen, ứng dụng sẽ không chạy, nhưng khi chạy test thì vẫn pass
File test
import React from 'react';
import ReactDOM from 'react-dom';
import Counter from '../counter';
import Enzyme, { shallow, render, mount } from 'enzyme';
import toJson from 'enzyme-to-json';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() })
test('increment method increments count', (
const wrapper = mount(<Counter />);
expect(wrapper.instance().state.count).toBe(0)
wrapper.instance().increment();
expect(wrapper.instance().state.count).toBe(1)
) => {})
Thứ nhất là cách viết test như vậy có vấn đề, chúng không mô phỏng cách mà user sẽ sử dụng, chúng ta gọi thẳng increment().
Nếu bạn simulate việc click nút button wrapper.find('button.counter-button').simulate('click') thay vì gọi increment(), test sẻ pass, nhưng lỡ đâu, một lần cập nhập nào đó bạn thay đổi className cho button, mà ko cập nhập lại test thì cũng toang.
Vậy người nông dân biết phải làm sao?
React-testing-library
Từ thư viện react-testing-library, nó đưa ra một nguyên lý chung như sau
Test càng gần với thực tế sử dụng của ứng dụng, test càng đem đến sự tự tin cho chúng ta
Hãy tâm niệm nguyên lý này trong đầu, chúng ta sẽ còn bàn tiếp về nó
useState
Hay bắt đầu test React hook, chúng ta đã và đang sử dụng nó nhiều hơn là class component
Với nguyên lý như đã nói, chúng ta sẽ thực hiện test như thế nào
Cách mà user sử dụng ứng dụng sẽ là: họ thấy một đoạn text trên UI Button, click vào, rồi thấy một kết quả sau khi click đó, một text mới xuất hiện chẳng hạn
Chúng ta cài đặt thư viện @testing-library/react (không phải react-testing-library nhé)
npm install @testing-library/react
Thực hiện việc test
import React from 'react'
import ReactDOM from 'react-dom'
import TestHook from '../test_hook.js'
import { render, fireEvent, cleanup } from '@testing-library/react'
import App from '..al/App'
afterEach(cleanup)
it('text in state is changed when button clicked', () => {
const { getByText } = render(<TestHook />)
expect(getByText(/Initial/i).textContent).toBe("Init State");
fireEvent.click(getByText("State change Button"))
expect(getByText(/Initial/i).textContent).toBe("Initial State Changed"))
})
it('button click changes props', () => {
const { getByText } = render(<App><TestHook/></App>)
expect(getByText(/Moe/i).textContent).toBe("Moe")
fireEvent.click(getByText("Change Name"))
expect(getByText(/Steve/i).textContent).toBe("Steve")
})
Vì không sử dụng shallow render, nên chúng ta phải gọi afterEach(cleanup) để dọn dẹp sau mỗi lực thực hiện test
getByText là phương thức nằm trong hàm render, còn vài kiểu query khác nữa, nhưng đây là kiểu mà chúng ta dùng nó nhiều nhất, có thể nói là đủ dùng.
Để test giá trị của state, chúng ta không sử dụng bất cứ tên hàm, tên biến state nào cả. Vẫn là nguyên lý “Không đi sâu vào việc thực hiện chi tiết”. Vì user sẽ thấy một đoạn text trên UI, chúng ta query nó trên DOM, chúng ta cũng query button bằng cách này và bắn ra sự kiện (fireEvent.click). Cuối cùng chúng ta kiểm tra kết quả cuối cùng nhận được, đoạn text bị thay đổi, chứ ko kiểm tra giá trị state (mặc dù nó là tương đương)
useReducer
Reducer chúng ta sẽ test
import * as ACTIONS from './actions'
export const initialState = {
stateprop1: false,
}
export const Reducer1 = (state = initialState, action) => {
switch(action.type) {
case "SUCCESS":
return {
...state,
stateprop1: true,
}
case "FAILURE":
return {
...state,
stateprop1: false,
}
default:
return state
}
}
Component này sẽ đổi giá trị của stateprop từ false sang true bằng việc dispatch một SUCCESS action
Thực hiện test
import React from 'react';
import ReactDOM from 'react-dom';
import TestHookReducer from '../test_hook_reducer.js';
import {render, fireEvent, cleanup} from '@testing-library/react';
import * as Reducer from '../../store/reducer';
import * as ACTIONS from '../../store/actions';
afterEach(cleanup)
describe('test the reducer and action', () => {
import { render } from "ejs";
it('should return the initial state', () => {
expect(Reducer.initialState).toEqual({ stateprop1: false })
});
it('should change stateprop1 from false to true', () => {
expect(Reducer.Reducer1(Reducer.initialState, ACTIONS.SUCCESS )).toEqual({ stateprop1: true })
})
})
it('reducer changes stateprop1 from fals to true', () => {
const { container, getByText } = render(<TestHookReducer />)
expect(getByText(/stateprop1 is/i).textContent).toBe("stateprop1 is false")
fireEvent.click(getByText("Dispatch success"))
expect(getByText(/stateprop1 is/i).textContent).toBe("stateprop1 is true")
})
Trước tiên chúng ta test cái reducer bên trong khối describe, thực hiện một test đơn giản với giá trị initial state và sau khi có action success.
Với ví dụ trên, reducer và action rất chi là đơn giản, bạn có thể nói không cần thực hiện unit test cho nó làm gì, nhưng trong thực tế sử dụng reducer sẽ không hề đơn giản thế, và việc test reducer là thực sự cần thiết, không những vậy, chúng ta còn phải test theo hướng chi tiết hiện thực bên trong.
Tiếp theo chúng ta có một test cho component, chúng ta vẫn sử dụng cách làm trước đó đã đề cập với useState, lấy DOM bằng cách query text và kiểm tra giá trị text sau khi có event click.
useContext
Giờ chúng ta đi đến việc test một component con có thể cập nhập context state trong component cha.
Thường thì context sẽ được khởi tạo trong một file riêng
Lưu ý: các giá trị của state, khởi tạo, cập nhập điều nằm trong App.js, chúng ta chỉ truyền giá trị này xuống các component con thông qua context, mọi thứ điều thực hiện ở App, cái này quan trọng cần nhớ để hiểu lúc test
import React from 'react';
import ReactDOM from 'react-dom';
import TestHookContext from '../test_hook_context.js';
import {act, render, fireEvent, cleanup} from '@testing-library/react';
import App from '../../../App'
import Context from '../../store/context';
afterEach(cleanup)
it('context value is updated by child component', () => {
const { container, getByText } = render(<App>
<Context.Provider>
<TestHookContext />
</Context.Provider>
</App>)
expect(getByText(/Some/i).textContent).toBe("Some text")
fireEvent.click(getByText("Change text"))
expect(getByText(/Some/i).textContent).toBe("Some other text")
})
Với context chúng ta cũng không hề thay đổi cách làm như với useState, vẫn là tìm và đặt expect thông qua kết quả nhận được cuối cùng.
Bên trong render function, chúng ta có include <Context.Provider/> và <TestHookContext/> để code dễ đọc hơn, chứ thật sự chúng ta không cần chúng. Test sẽ vẫn chạy nếu truyền vào <App /> bên trong render function
const { container, getByText } = render(<App />)
Tại sao lại như vậy?
Hãy nghĩ lại một chút về context, tất cả những state của context được handle bên trong App.js, vì lý do đó, đây là component chính chúng ta test, mặc dù trông thì có vẻ chúng ta test một child component sử dụng useContext hook. Chúng ta lại không thực hiện shallow render, mà render luôn các component con, nên dĩ nhiên <Context.Provider /> và <TestHookContext /> đều được render vì nó là con của <App />
Một ngày nào đó bạn ko muốn dùng create-react-app để khởi tạo project nữa, thì đây chính là bài hướng dẫn bạn cần đọc: setup một project từ a tới z mà không dùng create-react-app
Tạo thư mục mới nào
mkdir react-bolt
Vào bên trong thư mục react-bolt vừa tạo, chạy lệnh init
npm init -y
Lệnh này sẽ khởi tạo một project npm, trong đó có file package.json, nơi chúng ta chứa toàn bộ những dependencies
Bên trong webpack.common.babel.js chúng ta sẽ setup entry và output và các plugin. Các thiết đặt để chạy môi trường dev sẽ nằm trong webpack.dev.babel.js và môi trường production sẽ nằm trong webpack.prod.babel.js
npm install --save-dev eslint eslint-config-airbnb eslint-config-prettier eslint-loader eslint-plugin-babel eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-prettier eslint-plugin-react Bên trong thư mục gốc, tạo file .eslintrc để cấu hình cho eslint
Quiz 03 – Kambria Code Challenge đã diễn ra thành công, mời bạn cùng TopDev tổng kết những điểm đáng chú ý của cuộc thi.
Quiz 03 thu hút 209 bạn đăng ký tham gia
Cuộc thi được tổ chức vào thứ 7, ngày 02/05/2020
Các thí sinh đã trả lời 15 câu trắc nghiệm và câu hỏi ngắn
Chủ đề tập trung vào mô hình Recurrent Neural Network
Không có thí sinh nào đạt điểm tuyệt đối trong Quiz 03, nhưng chất lượng dự thi của các bạn thí sinh rất ấn tượng, trong đó bạn cao nhất đạt 8.5 điểm.
Các thí sinh lọt vào top 10 đã được đưa lên Leaderboard của cuộc thi
Top 10 bạn thí sinh có điểm số cao nhất sẽ có cơ hội được kết nối với các đối tác doanh nghiệp của Kambria, cung cấp các cơ hội nghề nghiệp trong thời gian tới.
Sau đây là danh sách những bạn chiến thắng Quiz 03:
🏆Quán quân: Le Nhat
🥇Á quân 1: Le Thanh Phuoc Hieu
🥈Á quân 2: Huynh Nguyen Thien Nhan
🥈Á quân 2: Truong Xuan Thanh
Nếu bạn bỏ lỡ cơ hội tham gia Quiz 03 vừa rồi, Kambria có tin vui dành cho các bạn. Bạn có thể giải lại các câu hỏi của Quiz 03. Hãy đọc và trả lời thật kĩ các câu hỏi, chúng sẽ là những gợi ý rất tốt cho bạn để chuẩn bị cho các cuộc thi sắp tới của Kambria Code Challenge.🔥
Để bắt đầu, bạn chỉ cần nhấn vào đường link bên dưới, tạo tài khoản Kambria sau đó chọn “Practice Quiz 03“. Sau khi hoàn thành Quiz, bạn hãy xem lại các câu trả lời của mình và so sánh chúng với đáp án từ Kambria. Chúng sẽ giúp ích cho bạn rất nhiều để nâng cao kiến thức về Recurrent Neural Networks đấy!
Kambria vui mừng thông báo, với sự giúp đỡ của các bạn, team đã quyên góp được 14,106,000 VND (tương đương $600) để ủng hộ cuộc chiến chống đại dịch COVID-19. Số tiền quyên góp tương đương với tổng giải thưởng trao cho các bạn chiến thắng Quiz 03 và nhận giải đăng ký sớm Quiz 03.
Toàn bộ số tiền quyên góp sẽ được gửi đến quỹ phòng chống dịch Covid-19 của Bộ Y tế Việt Nam, Ủy ban Trung ương Mặt trận Tổ quốc Việt Nam để hỗ trợ cho các cán bộ y tế và những người trực tiếp tham gia phòng, chống dịch tại các cơ sở y tế; những người bị ảnh hưởng gián tiếp bởi dịch Covid-19.
Kambria muốn gửi lời cảm ơn sự ủng hộ tuyệt vời của các bạn khi tham gia Quiz 03. Điều này đã giúp team gửi số tiền hỗ trợ này tới những người cần được giúp đỡ tại Việt Nam.
Kambria rất muốn nhận ý kiến đóng góp của bạn cho chương trình, bạn vui lòng giúp chúng tôi thực hiện khảo sát sau, khảo sát này sẽ giúp team cải thiện chất lượng chương trình trong các cuộc thi kế tiếp.
Nguyên tắc (principle) được áp dụng khi cần đưa ra một quyết định kỹ thuật trước vô vàng các lựa chọn. Nếu bạn đã biết được mọi thứ vận hành như thế nào, thì đã đến lúc bạn tiến một bước xa hơn, trả lời cho câu hỏi tại sao
Thời điểm hiện có khoảng 1 triệu người đang sử dụngadd-on Vue.js devtools của Chrome, đây là con số phản ánh có bao nhiêu lập trình viên đang thực sự sử dụng Vue, một con số không hề nhỏ. Còn trên Github, Vue đã vượt mặt React để trở thành bộ công cụ phổ biến nhất của Frontend, +31.4k lượt thích so với +22.9k của React, riêng bộ Vue Element Admin cũng có tới +22.7k lượt thích.
Nhiều thương hiệu và tên tuổi lớn tin tưởng sử dụng Vue, trong đó có Lois Vuitton (Vue + Nuxt), một phần newsfeed của Facebook, Netflix, Adobe, Grammarly, GitLab, Behance Danh sách 13 công ty sử dụng Vue.js
Biết người, biết ta, trăm trận trăm thắng
Ngày đầu ra đời, Vue là một dự án ngoài công ty, làm buổi tối của tác giả, không hề cần cân nhắc lựa chọn nào mới đúng với yêu cầu thực tế, tất cả được dựa trên những gì tôi muốn, các nhân tôi thích như vậy (tôi ở đây là Evan You). Khi bắt đầu được sự đón nhận từ cộng đồng, càng nhiều người sử dụng, bắt đầu có những nhu cầu khác nhau đến từ những đối tượng người sử dụng khác nhau. Với người thiết kế ra framework như tôi và đội ngũ, trách nhiệm đáp ứng nhu cầu này của người sử dụng là điều rất quan trọng, không như những dự án mà phía sau là các tập đoàn công ty lớn, đầu tiên họ sẽ tìm và giải quyết các vấn đề của công ty trước, sau đó đưa một phần source code ra bên ngoài cho cộng đồng sử dụng (open source), với Vue, mục tiêu cao nhất là hiểu được ai là người dùng Vue, họ dùng nó để làm gì, trong trường hợp nào.
Chúng tôi liệt kê ra những đối tượng người sử dụng Vue bao gồm:
Người mới bắt đầu, biết căn bản HTML/CSS
Dân chuyên nghiệp chuyển qua từ jQuery
Những người đã từng sử dụng một framework khác như React, Angular và muốn chuyển sang dùng Vue, để xem nó là gì, có ngon lành không
Lập trình viên backend, có chuyên môn ở những ngôn ngữ khác, muốn tìm một framework frontend gọn nhẹ, có thể dễ dàng tiếp cận
Những người chịu trách nhiệm kỹ thuật ở một công ty (TA, CTO, Lead), tìm kiếm một giải pháp nền tảng frontend cho công ty
Các dự án được cân nhắc khi sử dụng Vue gồm có
Đưa một vài tương tác vào trong một ứng dụng đã lâu đời nào đó, nếu viết lại từ đầu là điều không thể
Dự án có vòng đời ngắn, không cần cân nhắc đến vấn đề bảo trì nâng cấp sau này, coi như viết một lần, để đó xài luôn, muốn đưa nó ra thị trường càng sớm càng tốt (landing page)
Dự án tương đối vừa phải, không quá lớn, không quá nhỏ, độ phức tạp có thể đoán trước được, có thể đâu đó trong dự án sẽ có chút hơi rối rắm, nhưng không ảnh hưởng và bạn có thể chấp nhận nó.
Dự án lớn, bạn sẽ làm việc trên source code cả năm, với nhiều người cùng làm chung, nhiều người ra vào nhóm.
Bài toán với Vue là làm sao đáp ứng được tất cả những nhu cầu này
Khi thiết kế một framework lớn, đáp ứng được nhiều đối tượng sử dụng khác nhau, nhiều mục đích khác nhau, đương nhiên chúng tôi chấp nhận đánh đổi
Đây là những thứ chúng tôi có thể cho qua, như một phần phải đánh đổi để thỏa mãn được quá nhiều yêu cầu
API được tối ưu để dễ sử dụng nhất có thể dẫn đến các vấn đề khi bảo trì và mở rộng
Quá nhiều công cụ được dựng sẵn, đôi khi như một hàng rào giới hạn các tình huống sử dụng
Càng nhiều yêu cầu bổ sung các tính năng còn thiếu, vô số các tính năng lại không được đụng đến. Những người không có nhu cầu cho các tính năng đó lại chịu chung cục bundle như mọi người khác.
Thử thách
Khả năng tiếp cận và mở rộng
Đơn giản chưa được đánh giá đúng. Không thể làm cho mọi thứ thực sự đơn giản mà không phải hy sinh bất cứ điều gì. Đơn giản sẽ giúp nhiều người dễ tiếp cận Vue hơn, khi bạn trong một tổ chức, bạn có muốn nguồn lực giới hạn về con người, không phải công ty nào cũng có thể bỏ ra nhiều tiền để thuê một đội ngũ kỹ thuật cấp cao, trình độ javascript thượng thừa, không có chi phí đào tạo và hướng dẫn người mới. Chúng tôi không muốn bỏ qua tính đơn giản đang có trong Vue, cũng có thời điểm chúng tôi cũng muốn đưa những tính năng cao cấp, phức tạp, khả năng mở rộng cho các dự án lớn. Theo thời gian nhiều API chúng tôi cung cấp cho thấy những điểm khiếm khuyết, nhưng lại không muốn bỏ đi tính đơn giản.
Làm sao chúng tôi thỏa mãn được cả 2: vừa dễ dùng, vừa tân tiến? Một trong những ví dụ là việc hỗ trợ cả CDN build và Vue CLI
Bạn có thể sử dụng Vue như cách bạn dùng jQuery, dùng trực tiếp từ CDN, không cần cài đặt hay cấu hình. Nếu muốn, React bạn cũng thế làm được nhưng sẽ không thực sự đơn giản như với Vue, bạn vẫn thêm một số thư viện như babel để viết JSX. Nếu bạn cần can thiệp phức tạp hơn, sử dụng Vue CLI
Câu hỏi tiếp theo: Options API vs. Composition API
Khi bắt đầu, chúng tôi nghe rất nhiều phàn nàn, tại sao lại giới thiệu thêm một cách khác để làm cùng một việc? Chúng tôi giới thiệu thêm composition API trong Vue 3 là có lý do của nó.
Vấn đề của Option API
Rất trực quan, dễ tiếp cận
Khi bắt đầu có những component thực sự lớn, mọi thứ trở nên khó kiểm soát. Trong lúc viết các ứng dụng lớn, component lớn, bạn buộc phải chia các tính năng của component ra ở nhiều chỗ khác nhau, một component có thể có rất rất nhiều logic bên trong
Với Composition API
Không cần phải viết lại toàn bộ ứng dụng, bạn có thể tiếp tục sử dụng bộ codebase đang chạy. Nó có thể được sử dụng cùng với option API
Cung cấp khả năng linh hoạt trong việc quản lý code và tái sử dụng logic, kết hợp các API với nhau
Hỗ trợ tốt với TypeScript
Typescript vs Javascript
Tại sao TypeScript?
TypeScript có thật sự cần thiết không? Bạn có cần học TypeScript không? Câu trả lời là bạn không cần học TypeScript để có thể viết Vue. Bản thân Vue 3 cũng được viết trên JavaScript. Chúng tôi có hỗ trợ bộ type để thiết đặt làm việc chung với TypeScript
Lợi ích mang lại
Các IDE hỗ trợ xuất sắc trọng việc tự động nhắc lệnh và cung cấp thông tin về type. Một function cần bạn truyền vào những gì, nó sẽ trả về những gì, tất cả điều minh bạch
Tự tin khi cần refactor code cũ trong một dự án lớn. Nếu như bạn biết dự án đó sẽ tiếp tục kéo dài quá trình phát triển trong vòng 2, 3 năm tới, bạn sẽ tự tin hơn khi nhìn lại code của chính mình viết cách đây một năm về trước. Bạn sẽ biết được mình đã làm cái khỉ khô gì trước đây vậy.
Đánh đổi
Tốn thời gian học. Để thực sự trở thành developer thành thạo TypeScript hay bất cứ ngôn ngữ nào khác, bạn cần thời gian học nó một cách bài bản. Ví dụ khi bạn sử dụng các API của Vue, bạn sẽ thấy rất tường minh dễ hiểu, nhưng khi nhìn vào code bên trong của các API này, bạn sẽ không dễ gì hiểu được những gì đang xảy ra.
Thời gian chạy dự án lâu. Khi viết TypeScript, bạn bắt buộc phải nghĩ bạn sẽ dùng kiểu gì ngay từ đầu, bạn sẽ tốn thời gian để nghĩ những gì mình viết hơi lâu một chút
Bạn đừng đi vào kết luận dùng TypeScript là đúng hay sai, nó là kiểu lựa chọn sao cho phù hợp với dự án đang thực hiện
Template vs JSX
Tại sao chúng tôi lại cung cấp cả 2?
Có nhiều người sẽ sử bảo thích kiểu template, và cũng có người sẽ bảo JSX mới là đỉnh cao.
Lý do chúng tôi cung cấp cả 2 lựa chọn là vì muốn đáp ứng cho nhiều đối tượng người sử dụng khác nhau, những người quen với HTML, CSS sẽ thích template, thay vì phải lập trình lại suy nghĩ theo hướng javascript như JSX. Với template chúng tôi có thể tối ưu hiệu năng ở mức tốt nhất. Trong khi JSX lại cho phép linh động hơn trong lúc viết.
Chúng tôi muốn là một framework với tất cả các lựa chọn khác nhiều điều có, để tiếp cận được những người sử dụng từ nhiều background khác nhau.
Sức mạnh và Kích thước
Vấn đề kinh điển của Vue 2, khi bổ sung một tính năng mới, kích thước bundle tăng lên cho tất cả người sử dụng, dù bạn có dùng nó hay không. Ví dụ nếu chúng tôi muốn bổ sung <Fragment/> cho Vue, nghĩa là kích thước bundle sẽ tăng lên. Không ai thích trả thêm tiền cho thứ mình không dùng đến
Với Vue 3
Phần lớn các Global APIs và helper được cung cấp dưới dạng ES module export (tree-shakable). Thí dụ như keep-alive, transition, v-model, suspense nếu không sử dụng nó sẽ không được import
Bộ compiler generate cũng được tích hợp tree-shakable cho template của bạn
Dạo quanh các trang/video nói về định hướng công việc của ngành IT cho các bạn mới ra trường ở Việt Nam. Mình thấy hầu hết con đường mà mọi người nói tới là
Đi làm ở một công ty làm product hay outsource. Tích lũy đủ kinh nghiệm để lên các vị trí cao hơn.
Tiếp tục học lên cao ở nước ngoài để kiếm các cơ hội làm việc quốc tế.
Startup.
Mỗi hướng đi đều có cái thuận lợi và khó khăn nhất định, nhưng mình chưa thấy ai nói về việc làm các project mã nguồn mở như là một con đường để phát triển cả.
Mình hiện tại là commiter của Apache Solr và đã tham gia vào đóng góp cho project này được 5 năm. Hy vọng những thông tin dưới đây sẽ giúp ích được phần nào cho các bạn còn đang băn khoăn phải chọn hướng đi nào.
Cơ hội công việc khi tham gia open-source
Năm 2014 sau khi sử dụng Apache Solr một thời gian mình có mày mò vào page này https://lucene.apache.org/whoweare.html. Đó là danh sách những người đã và đang tham gia vào phát triển Solr (được gọi là các commiter của project đó). Tra cứu tên của họ thì thấy rằng hầu hết mọi người đều đang làm việc ở một số công ty nhất định. Như là Lucidworks, Elastic, Cloudera, Apple. Tương tự với Apache Spark thì hầu hết đều đang làm ở Databricks.
Mình nhận ra rằng các project mã nguồn mở đều có một hoặc một vài công ty đứng sau nó. Giúp định hướng, tuyển dụng lập trình viên để tham gia phát triển các project đó.
Điều đáng lưu ý ở đây là bất cứ ai cũng có thể trở thành commiter mà không cần phải làm việc cho bất kì công ty nào. Miễn là bạn chứng tỏ được khả năng, thái độ và quyết tâm của mình cho project đó. Cần lưu ý commiter thì rất ít so với số người sử dụng. Ví dụ với Apache Spark có tất cả 75 commiters trong 5 năm phát triển của mình nhưng số người, cty sử dụng Spark thì có thể là vài nghìn đến vài chục nghìn. Điều đó khiến commiters sở hữu một giấy thông hành vô hình giúp gõ cửa vào tất cả các cty lớn. Đơn giản vì họ là những người hiểu rõ công nghệ ấy nhất, có khả năng mở source-code ra để tối ưu hay sửa lỗi khi có vấn đề nảy sinh.
Mình đã được nhận vào làm việc ở Lucidworks khi mới đang còn là contributor của Apache Solr (contributor là người có đóng góp cho project, nhưng chưa đủ để trở thành committer).
Có một chiến lược phổ biến là nộp CV cho càng nhiều cty càng tốt giúp làm tăng cơ hội kiếm việc. Nhưng nhược điểm của chiến lược này là khá tốn thời gian và bạn không biết team, project mình tham gia là gì, công việc thực tế có như những gì mình kỳ vọng hay không. Khi đóng góp cho một open-source project và sau đó apply vào cty đứng sau project đó, bạn gần như biết chắc chắn mình sẽ làm gì làm với ai. Điều thú vị ở đây là thay vì nhà tuyển dụng chọn bạn, bạn được chọn nhà tuyển dụng và project mà bạn ưu thích.
Những lợi ích khác khi tham gia làm open-source
Được đào tạo miễn phí
Mỗi khi tạo một PR (pull request) cho một project. Sẽ đều có một người của project đó review PR của bạn trước khi nó được merge. Họ sẽ nói lên những vấn đề trong PR của bạn đôi khi là cách họ sẽ giải quyết vấn đề này. Đa số những commiter đều là những lập trình viên tại các công ty lớn nên bạn sẽ được học hỏi rất nhiều từ họ.
Tất cả những đóng góp của đều là mở
Không giống như làm việc tại các dự án đóng nơi mà tất cả những đóng góp rất khó có thể chia sẻ ra bên ngoài (một số công ty còn bắt phải ký cam kết không chia sẻ). Ở những dự án mã nguồn mở, tất cả đều là mở, từ những trao đổi, tài liệu thiết kế, đến các commits.
Do đó sẽ rất dễ dàng cho nhà tuyển dụng có thể xem và kiểm chứng những gì bạn đã làm. Đây sẽ là những điểm cộng lớn trong CV của bạn.
Cơ hội làm việc remote
Các commiters của một project đa phần sẽ nằm rải rác trên khắp địa cầu. Nên hầu hết các cty đứng đằng sau các open-source project đều có chế độ làm việc từ xa. Đơn giản cty không thể gom tất cả các commiters nằm rải rác về một nơi được.
Sự tự do về nơi làm việc mang đến rất nhiều lợi ích như
được ở gần gia đình
không chịu cảnh tắc đường mỗi ngày
làm việc từ một nơi bạn thích như từ một quán cafe ở Đà Lạt chẳng hạn
Cơ hội được đi nước ngoài
Mình đã đi Mỹ chắc cũng phải khoảng 6,7 lần gì đó, Canada 1 lần để tham gia các cuộc hội thảo công nghệ và gặp mặt mọi người trong công ty.
Công ty mình cũng đã bảo lãnh để cả gia đình mình sang UK, nhưng sau một năm ở đó thì vì nhiều lý do mình lại quyết định về nước.
Trở thành commiter không khó
Mình sẽ viết chi tiết hơn về cách để trở thành commiter. Nhưng phải nhấn mạnh là điều đó không hề khó miễn là bạn phải có tính kỷ luật và tinh thần cầu thị.
Trong bài viết này bạn sẽ biết được Frontend là gì? thế nào là một Frontend developer, những kỹ năng và nền tảng công nghệ mà bạn có thể học hỏi được từ việc trở thành một Frontend, cũng như tương lai nào cho bạn khi bạn trở thành một Frontend.
Frontend là gì?
Trước hết hãy tìm câu trả lời Frontend là gì?
Frontend là phần của trang web mà người dùng trực tiếp tương tác. Nó bao gồm thiết kế, thanh điều hướng, text, hình ảnh, video, và cấu trúc tổng thể của trang. Mục tiêu chính của frontend là đảm bảo tính tương thích và hiệu suất của trang web.
Khi vào một website hay một application, những gì bạn thấy, các nút bấm, những hành động click hay scroll trên trang đó là kết quả của lập trình Front End. Bạn có thể coi Front-End là client-side và Back-End là server-side.
Sự khác biệt giữa Front-End và Back-End là Front-End đề cập đến giao diện của trang web, trong khi Back-end đề cập đến cách trang web hoạt động.
Các ngôn ngữ chính dùng trong phát triển frontend bao gồm HTML, CSS và JavaScript. HTML định dạng cấu trúc nội dung, CSS điều chỉnh kiểu dáng và bố cục, còn JavaScript cung cấp tính năng động và tương tác cho trang web.
Frontend Developer là ai, làm công việc gì?
Trách nhiệm chính của Lập trình viên Front-End là tạo ra giao diện người dùng.
Lập trình viên Frontend là người chịu trách nhiệm phát triển giao diện website hoặc ứng dụng dựa vào thiết kế UI/UX, giúp website hoạt động mượt mà, tải nhanh và không gặp sự cố khi người dùng tương tác. Những lập trình viên còn phải đảm bảo rằng website có tính responsive tất cả các thiết bị, từ máy tính để bàn đến điện thoại di động, mà không có phần nào hoạt động bất thường tùy thuộc vào kích thước màn hình.
Frontend Developer là ai, làm công việc gì?
Nguồn ảnh: The Human Capital Hub
Những lập trình viên nhiều kinh nghiệm hơn thì nghĩ là: có thể lập trình Js như jQuery để làm animation, thực hiện các thao tác đồ hoạ của trên nền canvas của HTML5, hoặc là video.
Ngày nay với sự phát triển vượt bậc về nền tảng công nghệ như Nodejs, lý luận (Virtual DOM, PWA, AMP, Instance Article), sự hỗ trợ của phần cứng (đồ hoạ 3D), và các nền tảng phần mềm (Chrome, Safari), hệ điều hành (iOS, Android), kèm theo các kỹ thuật mới về Testing… dẫn đến Frontend dev không chỉ đơn thuần là làm các công việc nhàm chán, đơn giản mà còn hướng đến nhiều lĩnh vực khác nhau với đòi hỏi về kinh nghiệm, sự hiểu biết chuyên sâu, đa dạng từ hầu hết các lĩnh vực trong ngành phần mềm.
Lập trình viên Frontend cần sở hữu một loạt các kỹ năng để phát triển và duy trì các giao diện người dùng hiệu quả và hấp dẫn. Dưới đây là những kỹ năng quan trọng mà một lập trình viên Frontend nên có:
1. Ngôn Ngữ Lập Trình Cơ Bản
HTML: Được sử dụng để cấu trúc nội dung trên trang web.
CSS: Dùng để định dạng và thiết kế giao diện của trang web.
JavaScript: Cung cấp tính tương tác cho các phần tử trên trang web.
2. Framework và Thư Viện JavaScript và CSS
Bootstrap: Một framework CSS phổ biến giúp tạo giao diện người dùng responsive.
W3.CSS: Một framework CSS đơn giản và dễ sử dụng.
jQuery: Thư viện JavaScript giúp đơn giản hóa việc thao tác với DOM.
Angular: Một framework JavaScript mạnh mẽ để xây dựng các ứng dụng web động.
React: Một thư viện JavaScript của Facebook dùng để xây dựng giao diện người dùng.
3. Xử Lý API
REST: Giao thức API phổ biến dùng để tương tác với các dịch vụ web.
GraphQL: Một ngôn ngữ truy vấn API giúp lấy dữ liệu hiệu quả hơn.
4. Định Dạng Dữ Liệu
JSON: Định dạng dữ liệu nhẹ thường được sử dụng để truyền tải dữ liệu giữa client và server.
XML: Một định dạng dữ liệu khác, thường dùng trong các ứng dụng web truyền thống.
5. Công Cụ Phát Triển
Git: Hệ thống quản lý phiên bản phân tán, quan trọng để theo dõi và quản lý mã nguồn.
Những kỹ năng này giúp lập trình viên Frontend phát triển các giao diện người dùng hiệu quả, đáp ứng nhu cầu của người dùng và đảm bảo hiệu suất tối ưu cho trang web.
Những nền tảng công nghệ trong lập trình Frontend
Phần tiếp theo của bài viết, chúng ta sẽ lướt qua các nền tảng công nghệ mà khi bạn muốn trở thành frontend developer bạn cần phải biết cũng như có hiểu biết đúng đắn, đầy đủ và thật sâu về nó.
Những nền tảng này không chỉ ảnh hưởng đã từ rất lâu trong quá khứ, mà còn hiện tại cho đến tương lai về sau.
Hệ sinh thái CSS Framework
Ngày nay không khó để điểm mặt chỉ tên các nền tảng về css framework phổ biến như: Bootstrap, Foundation, SemanticUI và hàng loạt các tên tuổi khác có các thế mạnh, triết lý riêng.
Các framework cung cấp hàng loạt các tính năng, đáp ứng gần như là đầy đủ các yêu cầu cơ bản cần có đối với một sản phẩm được thiết kế theo hướng hiện đại: carousel, form, modal, drag/drop, datetime picker… nhằm giúp lập trình viên phát triển nhanh hơn ứng dụng của mình.
Hệ sinh thái jQuery
Sau nhiều năm đứng đầu về sự đóng góp của mình trong lĩnh vực Frontend, JQuery đã tạo cho mình một hệ sinh thái, một vị trí thống lĩnh mà hiếm có thư viện nào có thể sánh kịp. Các plugin của jQuery đã cung cấp hầu hết mọi thứ mà các lập trình viên cần đến, với lại rất dễ dàng để tích hợp vào source code của họ. API jQuery được thiết kế thông minh, dễ sử dụng, hầu hết là tương thích với các trình duyệt phổ biến đã làm giảm đi chi phí phát triển, kiểm lỗi và hạn chế được rất nhiều rủi ro.
Ngay cả khi các nền tảng về frontend lớn hiện tại như Angular, React, Vuejs không còn phụ thuộc vào nó nữa thì tư tưởng và tầm ảnh hưởng của nó sẽ vẫn còn trong rất nhiều năm tới, nếu không muốn nói là khó có thể thay thế được trong tương lai gần.
Và cũng tránh nhầm lẫn trong việc jQuery so sánh với các nền tảng như Angular, Reactjs… thì trong giới hạn của bài viết, bạn đọc có thể hình dung rằng đó là 2 nền tảng tiếp cận theo hai hướng hoàn toàn khác nhau, có thể chúng không phụ thuộc lẫn nhau nhưng không có nghĩa là chúng phủ định lẫn nhau.
Hệ sinh thái Nodejs
Nodejs có một hệ sinh thái đa dạng và rộng lớn, phát triển với tốc độ khủng khiếp chưa từng có, cùng với sự tham gia hỗ trợ của các ông lớn trong ngành bao gồm Microsoft, Google, Facebook v.v…
Với Nodejs bạn có thể tìm thấy mọi thứ mình cần, bao gồm các công cụ để phát triển Frontend, các phương pháp phát triển sản phẩm mới.
Hệ sinh thái Webpack
Webpack là một phần trong hệ sinh thái của Nodejs, nhưng vì tầm vóc và tương lai của nó nên chúng ta cũng nên tách nó ra thành một phần tương xứng. Webpack cung cấp cho chúng ta công cụ quan trọng để hiện thực hoá nhiều thao tác vốn phức tạp nay trở nên dễ dàng.
Các tiện ích mà Webpack cung cấp gần như là bao phủ tất cả, bao gồm giải quyết các vấn đề về tổ chức source code, giải quyết sự phụ thuộc giữa các thư viện, quản lý các resource như image, font, đi kèm với các công cụ để tối ưu source code như tách source nhỏ ra để tăng tốc tải trang…
Tương lai của một Frontend Dev
Ngày nay, với phong trào khởi nghiệp, các sản phẩm mới được phát triển không chỉ nhiều về số lượng, mà đa dạng về lĩch vực, các sản phẩm cũ cũng được nâng cấp lên về chất lượng, performance bên trong cũng như UI/UX bên ngoài tạo ra một nguồn cầu rất lớn từ thị trường.
Các ứng dụng giờ không chỉ được xây dựng cho desktop, mà còn phải chạy tốt trên nền tảng di động tạo ra gần như gấp đôi khối lượng công việc để làm. Ngoài ra nền tảng di động đòi hỏi các yêu cầu khắt khe hơn về các tiêu chí kỹ thuật như về performance, network, optimize việc sử dụng tài nguyên của thiết bị sao cho tối ưu nhất.
Một thị trường đa dạng, rộng lớn chắc chắn sẽ mang lại nhiều cơ hội nghề nghiệp hấp dẫn (số lượng), với mức lương cạnh tranh (chất lượng), điều đó làm nên một tương lai tươi sáng cho nghề nghiệp của chúng ta.
Kết luận
Việc trở thành một senior frontend cần thời gian, sự nghiêm túc và tập trung với một phương pháp học đúng đắn. Bạn cũng cần phải tìm thấy môi trường làm việc tốt để có thể ứng dụng và kiểm chứng các kiến thức của mình.
Vậy nên, hãy cứ khát khao, hãy cứ đam mê, thành công sẽ tìm đến bạn.