Home Blog Page 203

Họp báo khởi động chuỗi sự kiện Vietnam Mobile Day

Sáng ngày 18.04, TopDev phối hợp với VECOM (Hiệp hội TMĐT Việt Nam) đã tổ chức thành công buổi họp báo công bố sự trở lại của chuỗi sự kiện công nghệ lớn nhất Việt Nam – Vietnam Mobile Day. Buổi họp báo có sự tham gia của đại diện các nhà tài trợ, đối tác, đơn vị hỗ trợ, đơn vị đồng hành, diễn giả và các đơn vị Báo chí & Truyền thông.

Theo đại diện BTC, VMD2018 dự kiến thu hút hơn 10.000 lượt người tham dự và hơn 200 Techstartup; cùng hơn 100 topic chuyên sâu về công nghệ được chia sẽ bởi hơn 100 diễn giả đầu ngành trong và ngoài nước; đặc biệt là sự xuất hiện của các chuyên gia đến từ các tập đoàn lớn như: Google Play, Microsoft, Nielsen, Facebook,… chắc chắn sẽ làm thỏa lòng mong đợi của những tín đồ đam mê công nghệ, đồng thời mở ra nhiều cơ hội phát triển mới cho các doanh nghiệp trong lĩnh vực công nghệ tại Việt Nam.

Những topic chủ chốt của VMD lần đầu tiên được bật mí tại buổi họp báo:

  • Xu hướng và các điểm mới của phát triển Mobile tại Việt Nam và Thế giới
  • Sự phát triển của ứng dụng Blockchain vào kinh doanh và cuộc sống
  • Vai trò của trí thông minh nhân tạo AI trong các lĩnh vực IoT, Mobile và Fintech
  • Mobile Marketing trong tương lai kỷ nguyên AI
  • Ra mắt vườn ươm khởi nghiệp ứng dụng di động AppWorld

Qua 7 lần tổ chức thành công, Vietnam Mobile Day 2018 lần thứ 8 đang dần khẳng định được vị thế là diễn đàn công nghệ lớn nhất Việt Nam đặc biệt là trong lĩnh vực di động. Đây sẽ là sân chơi  không thể thiếu đối với mọi cá nhân, tổ chức lớn nhỏ quan tâm đến mối tương quan giữa công nghệ, di động và website trong thời đại 4.0.

Cùng điểm qua một số hình ảnh tại họp báo ra mắt sự kiện VMD2018:

Ông Nguyễn Hữu Bình – CEO TopDev đại diện BTC đã trình bày “Xu hướng và các điểm mới của phát triển Mobile tại Việt Nam và Thế Giới”
Ông Nguyễn Ngọc Dũng – Phó Chủ tịch VECOM  (Hiệp hội TMĐT Việt Nam) tđã chia sẻ “Ra mắt vườn ươm khới nghiệp ứng dụng di động AppWorld”
Anh Nguyễn Minh Đức – CEO IMGroup đã mang đến cho khán giả một chủ đề thú vị về AI – “Triển khai Marketing trên Mobile trong kỷ nguyên AI”
Anh Lê Mai Tùng – CEO EyeQ Tech đã phát biểu về “Vai trò của trí thông minh nhân tạo AI trong các lĩnh vực IoT, Mobile & Fintech”
Anh Giáp Văn Đại – CEO Nami Labs chia sẻ về “Sự phát triển của ứng dụng Blockchain vào kinh doanh và cuộc sống”
Họp báo có sự tham gia của đại diện các nhà tài trợ, đối tác, đơn vị hỗ trợ, đơn vị đồng hành, diễn giả và các đơn vị Báo chí & Truyền thông.
Họp báo có sự tham gia của đại diện các nhà tài trợ, đối tác, đơn vị hỗ trợ, đơn vị đồng hành, diễn giả và các đơn vị Báo chí & Truyền thông.
THỜI GIAN & ĐỊA ĐIỂM DIỄN RA SỰ KIỆN

TP. Hồ Chí Minh: 08/06/2018 tại Grand Palace, 142/18 Cộng Hòa, P.4, Q. Tân Bình, Tp.HCM

TP. Hà Nội: 15/06/2018 tại Trung tâm Hội nghị Forevermark, 614 Lạc Long Quân, Q. Tây Hồ, Hà Nội

THÔNG TIN CHI TIẾT VỀ SỰ KIỆN

Website: http://mobileday.vn

Fanpage chính thức: https://www.facebook.com/mobiledayevent/

 

10 Công ty hàng đầu thế giới sử dụng Node.js

Tác giả: Natalia Chrzanowska

Node.js là một công nghệ trending mà nhiều doanh nghiệp quyết định đưa vào vận hành. Nó rất phổ biến trong các app real-time hoặc khi chúng ta tìm kiếm môt giải pháp nhanh chóng và linh hoạt. Nó có rất nhiều ưu điểm so với các công nghệ khác và có lẽ vì thế mà ngày càng nhiều người lấn sân sử dụng Node.js trên app của mình như vậy. Họ kì vọng gì khi sử dụng Node.js khi tạo app như vậy? Chúng ta có một vài ví dụ công ty Nodejs điển hình như sau.

Netflix

Netflix là nhà cung cấp streaming media và video theo yêu cầu hàng đầu thế giới. Hệ thống data-driven của họ thường xuyên chạy những bài toán A/B testing khổng lồ để build nên trải nghiệm phong phú cho hơn 93 triệu subcriber toàn cầu. Một lượng lớn các unique package mỗi cycle dẫn đến một vấn đề về các dependency có điều kiện và khả năng mở rộng của ứng dụng. Đó à lí do tại sao công ty quyết định tận dụng sự nhanh và nhẹ của Node.js. Một trong những kết quả quan trọng của việc này là giảm gần 70% thời gian khởi động.

Bạn có thể tìm hiểu thêm về công trình của họ bằng Node.js trong bài trình bày sau.

Trello

Trello là một app quản lý project mà chúng ta thường dùng để theo sát công việc hằng ngày. Phần server của Trello được build bằng Node.js. Một server chạy theo dữ kiện, không blocking là một giải pháp tuyệt vời để thông báo update tức thì, đòi hỏi giữ rất nhiều liên kết. Node.js cũng giúp ích rất nhiều khi công ty đang thử nghiệm lần đầu một tool cho app single-page. Đây là một cách khởi đầu nhanh chóng và đảm bảo rằng mọi thứ vẫn đang đi đúng hướng.

Xem đầy đủ về tech stack của Trello trên Frog Creek blog.

trello_blog_2.jpg

PayPal

Hệ thống thanh toán điện tử toàn cầu PayPal cũng đã chuyển backend development của mình từ Java sang JavaScript và Node.js. Ban đầu, các team kĩ sư được chia thành nhóm code cho browser và nhóm cho các tầng ứng dụng, và nó không hoạt động hiệu quả. Sau đó các kĩ sư full stack tiến vào cuộc chơi, nhưng mô hình này cũng không lí tưởng. Cuối cùng thì chọn giải pháp dùng Node.js lại giải quyết được vấn đề của họ, vì nó cho phép viết browser và server app trên cùng một ngôn ngữ lập trình – JavaScript. Kết quả là, vấn đề ở cả hai phần được giải quyết và phản ứng với nhu cầu khách hàng hiệu quả hơn.

Nếu bạn tò mò về cách mà PayPal chuyển sang Node.js, xem bài blog post dưới đây.

LinkedIn

LinkedIn, doanh nghiệp và dịch vụ networking nghề nghiệp lớn nhất thế giới, cũng dựa trên Node.js, và mới năm ngoái họ đã chuyển app backend mobile của mình từ Ruby on Rails sang Node.js. Mặc dù vào thời điểm đó có vẻ không được thích hợp lắm, cuối cùng thực tế cũng cho thấy đây là một bước đi thông minh của công ty. App mới nhanh hơn từ 2 đến 10 lần so với các bản tiền thân của nó, và nó cũng cực kì nhẹ. Nhờ đó mà quá trình development cũng khá nhanh.

Hãy xem quá trình thay đổi của họ trên blog post trên VB.

StockSnap_JZTRVCLRJP-954990-edited.jpg

Walmart

Walmart là nhà bán lẻ lớn nhất trên thế giới, và họ cũng đang tiến vào thị trường bán lẻ trực tuyến. Ông lớn này cũng đang tham gia vào đoàn tàu sử dụng Node.js – một công nghệ rất trendy mặc dù dính phải nhiều nguy cơ tiềm tàng trong đó. Công ty đã tái thiết mobile app để cung cấp nhiều feature phức tạp ở phía client. Walmart đặc biệt tận dụng I/O bất đồng bộ nổi tiếng của của Node.js và các mô hình event loop single-threaded mà có thể xử lý các request concurrent hiệu quả.

Xem thêm những bài học rút ra từ việc chuyển sang Node.js để hiểu rõ hơn về bước đi của Walmart.

Uber

Uber, một platform kết nối tài xế với khách hàng cần dịch vụ di chuyển (kể cả chuyển phát đồ ăn), cũng tận dụng rất nhiều tool và ngôn ngữ lập trình trong app của mình. Tech stack của Uber không ngừng cải tiến, và họ cũng đã cho ra mắt các công nghệ mới rất hiệu quả trên nhiều lĩnh vực. Có thể nói, Node.js là một trong những bước chuyển mình không thể thiếu của công ty, vì nó giúp mở rộng nhanh chóng để đáp ứng nhu cầu tăng cao đối với dịch vụ mà họ cung cấp.

Xem thêm về Mối quan hệ của Uber và Node.js

pexels-photo (1).jpg

Medium

Medium là một platform publish online sử dụng Node.js cho web servers. Mặc dù mới nhìn qua thì web app trong như một trang HTML đơn giản, thực chất có rất nhiều công nghệ liên quan đằng sau nó. Medium là một data-driven platform, phát triển không ngừng theo user và hành vi của họ. Node.js đăc biệt hữu ích khi liên quan đến A/B testing để hiểu được những thay đổi của product và thử nghiệm những ý tưởng mới.

Tham khảo bài lời thú nhận của một kĩ sư Medium.

Ebay

Công ty thương mại điện tử đa quốc gia nổi tiếng cũng mở ra một cánh cửa công nghệ mới. Công ty đã chuyển sang Node.js vì 2 lý do chính: họ cần một app real-time để duy trì liên kết live với server và một giải pháp để bố trí một số lượng dịch vụ e-Bay lớn hiển thị thông tin trên page. Node.js dường như là một sự lựa chọn hoàn hảo.

Xem chi tiết trên tech blog của họ.

NASA

Vâng, NASA cũng sử dụng Node.js. Công nghệ này nắm giữ vai trò quan trọng hơn những app còn lại vì nó cứu rất nhiều mạng người, đảm bảo các phi hành gia an toàn trong những thời điểm va chạm không gian nguy hiểm. Sau các sự cố mất phi hành gia do data sai sót host ở nhiều địa điểm, NASA đối mặt với thách thức chuyển data về trang phục phi hành gia EVA sang một cloud database khác để giảm thời gian truy cập lại. Hệ thống mới của họ theo Node.js đã giảm thiểu số bước quy trình từ 28 xuống chỉ còn 7.

Tham khảo thêm về thách thức không gian của NASA.

sky-earth-space-working.jpg

Định hướng của tương lai

Các ví dụ trên chỉ là một vài tip sơ bộ của các công ty đã vận dụng Node.js vào sản phẩm của mình. Ngoài ra còn có rất nhiều ông lớn sử dụng Node.js như Microsoft, Google, Yahoo, Mozilla hoặc Github. Công nghệ có thể tạo ra vô vàng cơ hội trong qúa trình phát triển, và chúng ta có thể trông chờ vào nhiều app dựa trên Node.js hơn nữa trên thị trường trong tương lai không xa. Tại Việt Nam thì các công ty công nghệ cũng sử dụng Nodejs rất nhiều, nhìn vào danh sách này thì ta cũng biết ngôn ngữ này đang nóng hơn bao giờ hết.

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

Đi phỏng vấn vị trí React Native cần trang bị những gì?

Bài viết này TopDev sẽ tổng hợp một loạt các câu hỏi phỏng vấn React Native, phù hợp với mọi cấp độ lập trình viên React Native. Dưới đây là danh sách 30 câu hỏi phỏng vấn về React Native kèm theo câu trả lời ngắn gọn.

Câu hỏi phỏng vấn React Native cơ bản

  1. React Native khác gì so với ReactJS?
    React Native là một framework cho phép phát triển ứng dụng di động đa nền tảng bằng cách sử dụng cùng một mã nguồn, trong khi ReactJS là một thư viện JavaScript chủ yếu dùng để xây dựng giao diện người dùng cho các ứng dụng web. React Native sử dụng các thành phần UI native, trong khi ReactJS sử dụng DOM ảo để tối ưu hóa việc cập nhật giao diện người dùng trên web.
  2. Liệt kê các điểm chính để tích hợp React Native vào ứng dụng Android hiện có.
    Các điểm chính bao gồm: thêm các dependencies cần thiết vào dự án Android, thiết lập môi trường React Native CLI, tạo và liên kết một gói mới từ React Native vào dự án, và cuối cùng là tích hợp mã React Native với mã Android gốc.
  3. Mô tả mạng trong React Native và cách thực hiện các cuộc gọi mạng AJAX trong React Native?
    Mạng trong React Native được quản lý bằng cách sử dụng các phương thức AJAX tiêu chuẩn như fetch hoặc thư viện Axios. Các cuộc gọi mạng có thể được thực hiện bằng cách sử dụng fetch để lấy dữ liệu từ một API, xử lý nó và cập nhật state của ứng dụng.
  4. Props Drilling là gì và làm thế nào để tránh nó?
    Props Drilling là hiện tượng truyền props qua nhiều cấp của component, có thể gây rối và khó quản lý. Để tránh nó, bạn có thể sử dụng Context API hoặc Redux để quản lý state toàn cục, tránh việc phải truyền props qua nhiều lớp component.
  5. Làm thế nào để debug các ứng dụng React Native và nêu tên các công cụ được sử dụng?
    Bạn có thể debug ứng dụng React Native bằng cách sử dụng công cụ React Developer Tools, Chrome Developer Tools, hoặc Flipper. Debugger trong React Native cũng hỗ trợ việc kiểm tra và sửa lỗi qua việc sử dụng lệnh console, breakpoints và xem cấu trúc component.
  6. Mô tả các Timer trong ứng dụng React Native.
    React Native hỗ trợ các hàm timer như setTimeout, setInterval, clearTimeout, và clearInterval để quản lý thời gian và tạo các hành động lặp lại hoặc trì hoãn trong ứng dụng.
  7. Redux trong React Native là gì và các thành phần quan trọng của Redux được sử dụng trong ứng dụng React Native?
    Redux là một thư viện quản lý state toàn cục cho các ứng dụng JavaScript, bao gồm React Native. Các thành phần quan trọng của Redux bao gồm Actions, Reducers và Store. Actions là các sự kiện mô tả điều gì đó đã xảy ra, Reducers xác định cách state ứng dụng thay đổi để phản hồi lại Actions, và Store là nơi lưu trữ toàn bộ state của ứng dụng.
  8. State là gì và nó được sử dụng như thế nào trong React Native?
    State là một đối tượng trong một component React quản lý các dữ liệu thay đổi theo thời gian và quyết định giao diện hiển thị của component. Trong React Native, state được sử dụng để theo dõi và quản lý các thay đổi trong giao diện người dùng.
  9. Làm thế nào để xử lý đầu vào của người dùng trong React Native?
    Đầu vào của người dùng trong React Native được xử lý bằng cách sử dụng các thành phần như TextInput, Button, và các sự kiện như onChangeText hoặc onPress. Các sự kiện này sẽ cập nhật state của component và từ đó cập nhật giao diện người dùng.
  10. Props mặc định có sẵn trong React Native không và nếu có, chúng được sử dụng như thế nào?
    Có, props mặc định (defaultProps) có sẵn trong React Native và được sử dụng để định nghĩa giá trị mặc định cho các props nếu không được truyền vào từ component cha.
  11. Threads là gì và giải thích các loại thread khác nhau trong React Native với mỗi loại được sử dụng như thế nào?
    Threads là các chuỗi thực thi độc lập có thể chạy đồng thời. Trong React Native, có ba loại thread chính: Main Thread (xử lý giao diện người dùng), Shadow Thread (xử lý bố cục và giao diện) và JavaScript Thread (thực hiện mã JavaScript).
  12. Mô tả những lợi ích khi sử dụng React Native?
    React Native cho phép phát triển ứng dụng di động đa nền tảng với một cơ sở mã duy nhất, tiết kiệm thời gian và chi phí phát triển. Nó cung cấp hiệu suất gần như native, cho phép tái sử dụng mã giữa các nền tảng và có cộng đồng hỗ trợ lớn.
  13. Flexbox là gì và mô tả các thuộc tính được sử dụng nhiều nhất của nó?
    Flexbox là một hệ thống bố cục được sử dụng trong React Native để tổ chức các thành phần trên giao diện người dùng. Các thuộc tính thường dùng bao gồm flexDirection, justifyContent, alignItems, và flexWrap.

Tham khảo việc làm React Native hấp dẫn trên TopDev

Câu hỏi phỏng vấn React Native trung cấp

  1. Nêu tên các thành phần cốt lõi trong React Native và sự tương đồng của chúng với web?
    Các thành phần cốt lõi trong React Native bao gồm View (tương tự div trên web), Text (tương tự p), và Image (tương tự img). Chúng cung cấp các khối xây dựng cơ bản để tạo giao diện người dùng trên di động.
  2. Giải thích Async Storage trong React Native và định nghĩa khi nào nên sử dụng nó và khi nào không nên?
    Async Storage là một hệ thống lưu trữ dữ liệu đơn giản cho phép lưu trữ các cặp key-value trên thiết bị di động. Nó nên được sử dụng để lưu trữ dữ liệu mà không yêu cầu bảo mật cao, như cài đặt ứng dụng, và không nên sử dụng cho dữ liệu nhạy cảm hoặc dung lượng lớn.
  3. Các cách khác nhau để định kiểu ứng dụng React Native là gì?
    Có thể định kiểu ứng dụng React Native bằng cách sử dụng StyleSheet, inline styles, hoặc các thư viện bên thứ ba như Styled Components hay Emotion.
  4. Làm thế nào để sử dụng Routing với React Navigation trong React Native?
    React Navigation là một thư viện phổ biến để quản lý điều hướng trong React Native. Nó cung cấp các navigator như Stack Navigator, Tab Navigator, và Drawer Navigator để quản lý các màn hình và điều hướng giữa chúng.
  5. Giải thích các thành phần FlatList, các tính năng chính của nó cùng với một ví dụ mã?
    FlatList là một thành phần hiệu quả để render danh sách cuộn dài trong React Native. Nó cung cấp các tính năng như lazy loading, pagination và custom item rendering. Một ví dụ cơ bản:
<FlatList
  data={dataArray}
  renderItem={({ item }) => <Text>{item.key}</Text>}
  keyExtractor={item => item.id}
/>
  1. Các thành phần Touchable trong React Native là gì và khi nào nên sử dụng chúng?
    Touchable components là các thành phần tương tác như TouchableOpacity, TouchableHighlight, TouchableNativeFeedback, và TouchableWithoutFeedback. Chúng nên được sử dụng khi bạn cần thực hiện các hành động khi người dùng chạm vào một thành phần.
  2. Làm thế nào để viết mã khác nhau cho iOS và Android trong cùng một codebase? Có module nào hỗ trợ việc này không?
    Có thể viết mã khác nhau cho iOS và Android bằng cách sử dụng các phần mở rộng .ios.js.android.js. React Native CLI tự động xác định hệ điều hành và chạy file tương ứng. Ngoài ra, có thể sử dụng module Platform để phân biệt mã.

    Module platform sẽ phát hiện từng nền tảng khi ứng dụng được chạy.

    import { Platform, Stylesheet } from 'react-native';
    
    const styles = Stylesheet.create({
        height: Platform.OS === 'IOS' ? 200 : 400
    })
  3. ListView là gì và mô tả cách sử dụng nó trong React Native?
    ListView là một thành phần cũ để render danh sách trong React Native. Nó đã được thay thế bằng FlatListSectionList nhưng vẫn có thể được sử dụng cho các ứng dụng cũ hoặc với các danh sách không quá dài.
  4. Bridge là gì và tại sao nó được sử dụng trong React Native? Giải thích cho cả Android và iOS.
    Bridge là một cơ chế cho phép giao tiếp giữa mã JavaScript và mã native (Java, Swift) trong React Native. Nó giúp React Native tương tác với các API native và sử dụng các tính năng không có sẵn trong thư viện mặc định.
  5. Toàn bộ mã React Native được xử lý như thế nào để hiển thị kết quả cuối cùng trên màn hình di động?
    Mã React Native được dịch thành các lệnh giao diện người dùng native bằng cách sử dụng Bridge. JavaScript thực thi trên một JavaScript thread và giao tiếp với mã native thông qua Bridge để cập nhật giao diện người dùng.

>> Xem thêm: Lộ trình học React Native từ cơ bản đến nâng cao

Câu hỏi phỏng vấn React Native nâng cao

  1. Làm thế nào để làm cho ứng dụng React Native của bạn chạy mượt mà với các animation?
    Có thể tối ưu hóa animation trong React Native bằng cách sử dụng Animated API, LayoutAnimation, hoặc thư viện bên thứ ba như Reanimated. Các kỹ thuật như batching updates và giảm số lượng renders cũng giúp cải thiện hiệu suất.
  2. Giải thích setNativeProps. Nó có gây ra vấn đề hiệu suất không và được sử dụng như thế nào?
    setNativeProps cho phép thay đổi thuộc tính của một component native mà không cần render lại toàn bộ component, giúp cải thiện hiệu suất. Tuy nhiên, nó có thể gây ra các vấn đề về hiệu suất nếu lạm dụng hoặc sử dụng không đúng cách.
  3. Network Security và SSL Pinning là gì?
    Network Security là các biện pháp bảo mật để bảo vệ dữ liệu truyền tải qua mạng. SSL Pinning là một kỹ thuật giúp bảo vệ chống lại các cuộc tấn công man-in-the-middle bằng cách chỉ chấp nhận chứng chỉ SSL cụ thể đã được pin trên ứng dụng.
  4. Có phương pháp nào lưu trữ dữ liệu nhạy cảm trong React Native không? Nếu có, hãy nêu phương pháp đó, nếu không có thì làm thế nào để đạt được điều này?
    React Native không cung cấp phương pháp tích hợp sẵn để lưu trữ dữ liệu nhạy cảm. Tuy nhiên, có thể sử dụng các thư viện như react-native-keychain hoặc react-native-sensitive-info để lưu trữ dữ liệu nhạy cảm một cách an toàn.
  5. Mô tả vấn đề rò rỉ bộ nhớ trong React Native, làm thế nào để phát hiện và giải quyết nó?
    Rò rỉ bộ nhớ xảy ra khi ứng dụng không giải phóng bộ nhớ sau khi sử dụng, dẫn đến việc sử dụng bộ nhớ không cần thiết. Để phát hiện rò rỉ bộ nhớ, có thể sử dụng công cụ Profiler trong React Native Debugger hoặc Android Studio. Giải quyết bằng cách kiểm tra và đảm bảo giải phóng các references không cần thiết và hủy đăng ký các sự kiện khi component bị hủy.
  6. Liệt kê một số bước để tối ưu hóa ứng dụng.
    Một số bước tối ưu hóa bao gồm: sử dụng PureComponent hoặc shouldComponentUpdate để tránh render lại không cần thiết, tối ưu hóa hình ảnh, sử dụng FlatList hoặc SectionList thay vì ListView, và giảm kích thước bundle bằng cách chỉ import các module cần thiết.
  7. Nguyên nhân thực sự gây ra vấn đề hiệu suất trong React Native là gì?
    Vấn đề hiệu suất trong React Native thường đến từ việc render lại quá nhiều lần, sử dụng bộ nhớ không hiệu quả, quản lý state không tốt, và giao tiếp không hiệu quả giữa JavaScript và mã native thông qua Bridge.

Các câu trả lời ngắn gọn này cung cấp một cái nhìn tổng quan về những kiến thức cơ bản, trung cấp, và nâng cao cần thiết khi chuẩn bị phỏng vấn cho một vị trí liên quan đến React Native.

Những kiến thức cơ bản cần trang bị trước khi phỏng vấn React Native

  1. Phải nắm vững các cú pháp ES6/7, các thao tác với mảng và object phải biết map, filter, find, reduce. Biết await/async là lợi thế.
  2. Hiểu rõ bản chất props và state, life cycle, phân biệt được stateless và stateful component (hoặc smart và dump component).
  3. Tổ chức component phải rõ ràng, tách bạch khai báo styles, hình ảnh. Cách phân tích 1 component: có thể đưa bạn 1 hình ảnh màn hình bạn có thể nói được các thành phần bên trong và cách tổ chức chúng.
  4. Biết cách thao tác với Rest API: đây là bắt buộc. Hiểu được POST/GET/PUT, body data và header (token user).
  5. Biết xài Redux là 1 lợi thế: xin đừng nói bạn chỉ làm app nhỏ nên ko cần Redux, vì như thế chứng tỏ bạn chưa sẵn sàng để học cái mới. Thậm chí công ty mình dùng MobX nên sẽ hỏi bạn có sẵn sàng đổi qua MobX không.
  6. Đã biết sử dụng 1 số lib như React Navigation, React Native Maps, chụp ảnh và chọn ảnh, location, …
  7. Biết làm animation là lợi thế lớn.
  8. Bạn biết lập trình native là lợi thế rất lớn dù là iOS hoặc Android.

QUAN TRỌNG nếu bạn vẫn chưa biết gì, hãy cứ thành thật nói chưa biết gì. Lúc đó mình chỉ quan tâm đến thái độ và mức độ mưu cầu kiến thức của bạn. Trường hợp này mình đánh giá rất cao, thực tế là trên tất cả những kỹ năng ở trên. Tránh cố nói những điều mình không biết và để lại ấn tượng “chém gió” trong đầu nhà tuyển dụng. Nhiều công ty đang tuyển React Native lương khá ngon ở đây nhé TopDev – Việc làm IT.

Dùng gì để lưu trữ data thay thế local storage?

Local storage là gì? Xin hãy ngừng dùng local storage.

Dùng cái gì thay thế Local Storage

Pointing Man

Với quá nhiều nhược điểm như vậy thì nên sử dụng cái nào thay thế đây. Dưới đây là một vài phương pháp thay thế cho bạn.

Data nhạy cảm

Nếu bạn cần lưu trữ dạng này, bạn nên dùng một server-side session. Nó bao gồm:

  • Các user ID
  • Session ID
  • JWT
  • Info cá nhân
  • Info credit card
  • API keys
  • Và những thứ bạn không muốn share công khai trên Facebook

Nếu bạn cần store thông tin nhạy cảm, đây là cách bạn nên làm:

  • Khi một user log vào website của bạn, tạo một session identifier và lưu trữ nó lên một cookie. Nếu bạn đang dùng web framework, hãy tìm “cách tạo user session dùng cookies” và làm theo hướng dẫn.
  • Đảm bảo rằng bất kì thư viện cookie của web framework của bạn dùng đều có httpOnlycookie flag. Flag này làm cho browser không thể đọc cookies, để dùng server-side sessions an toàn bằng cookies.
  • Đảm bảo rằng cookie library cũng có cài SameSite=strict cookie flag (để tránh bị tân công CSRF), cũng như secure=true flag (đảm bảo cookies chỉ được cài qua kết nối được mã hóa).
  • Cứ mỗi lần user gửi request đến site của bạn, dùng session ID của họ (extract từ cookie họ gửi) để lấy account detail hoặc từ database hoặc từ cache (phụ thuộc vào độ lớn của website).
  • Một khi bạn lấy được thông tin account của user, bạn có thể lấy bất kì data nào bằng nó.

Pattern này rất đơn giản, trực tiếp, và quan trọng nhất là: secure. Và bạn còn có thể scale up trang web sử dụng pattern này. Đừng nói tôi rằng các JWTs “nhanh” và “độc lập” và bạn phải dùng local storage để store chúng: bạn sai rồi!

Non-String Data

Nếu bạn cần store data trong browser mà không nhạy cảm và không thuần string, sự lựa chọn tốt nhất cho bạn là IndexedDB. Đây là một API để bạn làm việc với object thuộc database lưu trữ trong browser.

Điều tuyệt vời về IndexedDB đó là có thể dùng nó để lưu trữ thông tin loại: số nguyên, float, etc. Bạn có thể xác định các key chính, xử lý indexing, và tạo giao dịch để ngăn chặn vấn đề hợp nhất dataa.

Bạn có thể xem nhiều tutorial về IndexedDB trên Google tutorial này.

Offline Data

Nếu bạn cần app chạy offline, option tốt nhất đó là dùng combination của IndexedDB và Cache API (một phần của Service Workers).

Cache API cho phép bạn cache network resources mà app cần load.

Bạn có thể xem nhiều tutorial về Cache API trên Google tutorial này.

Lời cuối

Happy Rage Face

Bây giờ sau khi đã nói về local storage, tôi hi vọng bạn đã hiểu tại sao bạn không nên sử dụng đó nữa.

Bạn vẫn có thể sử dụng nó để lưu trữ thông tin công khai đảm bảo:

  • Thông tin không quá nhạy cảm
  • Không dùng cho các app lớn
  • Không lớn hơn quá 5MB
  • Chứ string data

Còn lại thì làm ơn đừng dùng local storage! Dùng tool đúng cho từng mục đích.

Và bất kể bạn làm gì, đừng lưu trữ session info (như JSON Web Tokens) trong local storage. Đây là một ý rất tồi và sẽ đưa bạn đến hàng loạt cuộc tấn công có thể ảnh hưởng nặng đến user.

TopDev

KMS Technology khai trương văn phòng thứ 4 tại Việt Nam, công bố kế hoạch gia tăng nhân sự đến 1200 nhân viên

Sáng ngày 12/04/2018, KMS Technology khai trương văn phòng làm việc thứ 4 tại địa chỉ số 02 đường Tản Viên, quân Tân Bình, Tp. Hồ Chí Minh.

KMS Technology được thành lập năm 2009, là công ty hàng đầu vê lĩnh vực gia công phần mềm có trụ sở hoạt động tại California, Georgia và Việt Nam. KMS Technology hiện có hơn 800 nhân viên sau 9 năm hoạt động trên thị trường với nhiều năm liên tiếp góp mặt vào Top 10 Sao Khuê. Công ty này cũng từng có mặt trong danh sách Vietnam Best Places to Work trong 3 năm 2016, 2017 và 2018 (do Anphabe và Intage công bố).Tại buổi khai trường văn phòng thứ 4 tại Việt Nam, KMS công bố kế hoạch gia tăng nhân sự lên đến 1200 người trong năm 2018. Phát biểu tại buổi ra mắt ông Trần Trọng Đại, Tổng Giám Đốc công ty KMS Technology cho biết: “Khai trương văn phòng mới, công bố kế hoạch gia tăng nhân sự lên đến 1200 người là một tín hiệu đáng khích lệ, không chỉ riêng KMS Technology, mà cả thị trường nhân lực ngành công nghệ thông tin nói chung tại Việt Nam. Trong năm nay, công ty sẽ chú trọng đẩy mạnh hơn nữa về mặt con người, thường xuyên tham gia các họat động đào tạo nguồn nhân lực ngành CNTT trong nước, liên kết hợp tác với các trường đại học, các sự kiện chuyên ngành, chương trình học bổng khuyến học và hỗ trợ các tổ chức phi lợi nhuận hướng nghiệp cho sinh viên vùng cao Việt Nam.

Ông Trần Trọng Đại, Tổng Giám Đốc công ty KMS Technology phát biểu tại buổi ra mắt văn phòng

Cũng trong dịp này, KMS Technology tài trợ 200 triệu đồng cho tổ chức phi lợi nhuận, passerelles numériques, với mục đích đào tạo Công Nghệ Thông Tin cho sinh viên miền Trung Việt Nam.

Đại diện KMS Technology trao gói tài trợ 200 triệu đồng cho tổ chức phi lợi nhuận, passerelles numériques

Theo đó, KMS Technology sẽ tài trợ học bổng – tham gia giảng dạy và nâng cấp trang thiêt bị phòng mát cho sinh viên, ngoài ra công ty cũng sẽ tạo điều kiện để sinh viên có cơ hội tham gia thực tập tại văn phòng công ty, trải nghiệm kiến thức thực tế và trang bị những kỹ năng theo nhu cầu của thị trường nhân lực ngành.

Cùng điểm qua một số hình ảnh về văn phòng làm việc của KMS văn phòng Tản Viên.

Văn phòng KMS – Tản Viên có tổng diện tích 3000m
Sức chứa của văn phòng KMS Technology – số 2 Tản Viên lên đến 650 chỗ ngồi
Không gian làm việc mở, khuyến khích sự sáng tạo của nhân viên
Không gian làm việc mở, khuyến khích sự sáng tạo của nhân viên

TopDev

Ra mắt vườn ươm AppWorld quỹ hỗ trợ khởi nghiệp nội dung số lên đến $1,000,000 USD

Vườn ươm AppWorld là dự án được liên kết thực hiện giữa Yeah1 Group, Hiệp Hội Thương Mại Điện Tử Việt Nam (Vecom) và Trung ương hội Liên hiệp Thanh niên Việt Nam.

Ra đời nhằm tìm kiếm những ý tưởng, ứng dụng di động độc đáo, và hỗ trợ những ý tưởng thành hiện thực, mang chúng đến với hàng triệu người dùng. Nơi tạo ra những câu chuyện thần kỳ như flappy bird của Nguyễn Hà Đông vừa qua…Thúc đẩy ngành công nghiệp nội dung số cho Việt Nam.

Dự án đặc biệt hỗ trợ các cá nhân hoặc doanh nghiệp:

+ Có ý tưởng sáng tạo App nhưng không biết lập trình để hiện thực hóa ý tưởng
+ Hoặc đã có App nhưng không biết cách quảng bá đến nhiều người
+ Đam mê công nghệ và muốn khởi nghiệp Online với các ứng dụng di động

Tham gia cộng đồng AppWorld sẽ được:

+ Được định hướng và sáng tạo ứng dụng của riêng mình, tư vấn phát triển nội dung từ các mentor có kinh nghiệm .
+ Đưa ứng dụng tiếp cận đến hàng triệu người dùng toàn cầu bằng hệ thống media từ Yeah1 Network với lượng cộng đồng trẻ & Influencer có khả năng viral cao trong nước và quốc tế.
+ Tích hợp hệ thống tracking để cải tiến ứng dụng liên tục nhằm đảm bảo theo kịp thị hiếu thị trường.
+ Được hỗ trợ phát triển và hiện thực hóa ý tưởng bởi đội ngũ lập trình chuyên môn cao.
+ Doanh thu cực kỳ cạnh tranh từ hệ thống quảng cáo trực tuyến có thể cạnh tranh với Google hoặc Ad Exchange, Ad Network khác.
+ Team Growth Hacking phân tích các chỉ số ứng dụng để phát triển sâu các ứng dụng tiềm năng.
+ ĐẶC BIỆT CÁC Ý TƯỞNG KHẢ CÓ KHẢ NĂNG ĐƯỢC TIẾP CẬN NGUỒN VỐN TỪ APPWORLD FUND (1M USD).

Thân mời anh/chị quan tâm đến nội dung số, sáng tạo App, đến dự sự kiện ra mắt AppWorld vào sáng thứ 7 tuần này tại HCM.

Thông tin chi tiết sự kiện:

http://www.appworld.vn/

Anh/chị vui lòng đăng ký trước khi đến tham dự, trực tiếp tại:

http://www.appworld.vn/dang-ky/

 

Giữ lửa đam mê học lập trình : Câu chuyện không của riêng ai

Bài viết được TopDev tổng hợp ghi chép từ lời khuyên của những expert trong công đồng lập trình tại Việt Nam, hy vọng sẽ góp một phần thêm động lực cho việc học hỏi thêm cái mới.

Như bạn biết đó, trong ngành lập trình này chúng ta luôn phải học hỏi và vận động, chỉ cần bạn dừng lại một chút thì đã tụt lại sau khá nhanh. Ngoài ra, càng lớn tuổi, càng nhiều năm kinh nghiệm thì bạn lại càng mất đi động lực để học vì nhiều lý do khác nhau, đây cũng là vấn đề gây nên lên các tranh luận sôi nổi trong cộng động lập trình.

Nhưng dù sao đi nữa, thì tôi biết chắc một điều rằng: Nếu bạn gắn bó với cái gì đó và luôn sẵn sàng tò mò tìm hiểu, thì bạn sẽ luôn học được điều mới mẻ từ chúng. Tôi không giải thích được tại sao. Nó chỉ hiệu quả như thế thôi. Lý do duy nhất để không hiệu quả đó là không còn hứng thú, đam mê và động lực nữa, điều này là rất dễ xảy ra. Đối với nhiều người họ có những thứ có thể thúc đẩy họ và giúp họ giữ lửa, thì cũng sẽ có những thứ làm họ thụt lùi. Nó có thể xuất phát từ những sự bất an hoặc từ bỏ, nhưng quy cho cùng thì nó vẫn tồn tại.

Để vượt qua những trở ngại này, bạn phải biết cách học những cái bạn cần học. Lập trình là những chuỗi ngày bất ngờ không hồi kết cho đến khi bạn nhìn lại và nhận ra mình là một dev có kinh nghiệm. Quá trình code cần một người cứng rắn mỗi khi bạn gặp trở ngại, nên bạn phải học cách xử lý và sống với nó. Những chỗ khó khăn nguy hiểm nhất trên chặng đường của bạn cũng là những thứ có thể đưa bạn lên level mới, nếu bạn đủ chín chắn và vững vàng. Những cơ hội rất dễ tuột mất nếu như bạn rơi vào hố đen lười biếng và trì trệ.

Bạn không cần phải lo lắng nếu như đi tìm hiểu quá chuyên sâu về một chủ đề riêng, vì càng đi sâu thì bạn càng học được về nhiều thứ khác nữa. Ví dụ, nếu bạn chỉ được đào tạo để trở thành một front-end developer, có lẽ bạn sẽ lo lắng vì không hiểu chuyện gì đang xảy ra. “Tôi không hiểu những cái này là gì. Bao giờ tôi mới trở thành một dev chuyên nghiệp đây…”. Rồi bạn sẽ nản chí, nhưng vấn đề là bạn không cần phải theo đuổi cả tỷ thứ bạn không cần đến, vì mọi thứ tự nhiên sẽ đến khi bạn không ngừng tự thúc đẩy và tìm tòi. Rồi sẽ đến thời điểm, đừng hấp tấp. Những người đi trước đều khuyên thế cả.

Vì thế hãy cứ tập trung vào các task hiện tại, tiếp tục tìm tòi và làm bất cứ thứ gì bạn muốn để tự thúc đẩy bản thân phát triển. Quá trình này tiêu tốn nhiều năm tháng nên bạn không thể vội vã được đâu. Nếu như bạn nghĩ rằng cần một môi trường để có động lực thúc đẩy, để có cơ hội trải nghiệm và thực hiện những cái mới, TopDev – Việc làm IT cho Top Developer luôn mong chờ bạn accept challenge. Cám ơn bạn đã đọc bài viết và hẹn gặp lại bạn ở những Advice khác.

TopDev

  Những sự thật ít người biết tới về nghề lập trình
  Cải thiện mối quan hệ giữa lập trình viên với sếp: dễ hay khó? (P1)

Các Laravel route tips giúp bạn cải thiện routing

Laravel router có một bộ API rất hữu dụng và hoàn thiện dành cho bạn khi mới bước chân vào Laravel. Những tip dưới đây không phải là quá mới hay bí ẩn, nhưng sẽ giúp ích rất nhiều khi bạn học Laravel 5.

Custom Namespaces

Như đã nói, nếu bạn muốn một nhóm routes sử dụng một namespace như App\Http\Controllers\Admin, bạn có thể xác định namespace bằng cách dùng fluent routing API có trong Laravel 5.4:

Route::namespace('Admin')->group(function () {
    // Controllers Within The "App\Http\Controllers\Admin" Namespace
});

Đây chính là cách sử dụng trong RouteServiceProvider tìm thấy trong mỗi Laravel project:

protected function mapWebRoutes()
{
    Route::middleware('web')
         ->namespace($this->namespace)
         ->group(base_path('routes/web.php'));
}

Do file routes/web.php có namespace, Admin namespace cũng chỉ là tương đối.

Bạn có thể chạy console command sau để tạo các controller trên App\Http\Controllers\Admin:

php artisan make:controller -r Admin/UsersController

Trong ví dụ routing trước, definition của chúng ta trong file routes/web.php trông thế này:

Route::namespace('Admin')
    ->prefix('admin')
    ->group(function () {
        Route::resource('users', 'UsersController');
    });

Route Macros

Router là macroable (Giải thích sơ qua: nó cho phép chúng ta thêm một phương thức hay có thể gọi là một macro, vào một class có sẵn. ), nghĩa là nếu bạn có một nhóm routes mà bạn muốn cung cấp thông qua một package hoặc các nhóm route được cấu hình sẵn có thể tái sử dụng, bạn có thể define một macro trên một service provider.

Ví dụ, bạn có các shopping route cho một shop thương mại điện tử mà bạn đóng nó thành một package, và cho phép user override hoặc customize vài thành phần của routes:

// Inside a service provider boot()

public function boot()
{
    Route::macro('shopRoutes', function ($prefix) {
        Route::group([
            'prefix' => $prefix,
            'middleware' => ['shopping'],
        ], function () {
            Route::get('products/{product}', 'ProductsController@show');
            // ...
        });
    });
}

Sau đó khách hàng có thể call macro trong app Laravel mới bên trong routes/web.php:

collect(config('languages'))->each(function ($language) {
    Route::shopRoutes($language);
});

Hoặc một implemention khác tương tự vậy:

Route::macro('shopRoutes', function ($languages) {
    Route::group([
        'prefix' => '/{language}',
        'middleware' => ['shopping'],
        'where' => ['language' => implode('|', $languages)],
    ], function () {
        Route::get('products/{product}', 'ProductsController@show');
        // ...
    });
});

Các ví dụ về macro rất đa dạng, nhưng bạn chỉ cần nắm cái ý tưởng là được. Tôi đề xuất rằng bạn chỉ nên sử dụng route macro nếu bạn gặp trường hợp như trên. Bạn sẽ biết khi nào là cần thiết!

Debug Routes

Nếu bạn đang tìm mọi cách để find route hoặc debug tất cả các route, command artisan route:list rất hữu ích:

artisan route:list
+--------+----------+----------+------+---------+--------------+
| Domain | Method   | URI      | Name | Action  | Middleware   |
+--------+----------+----------+------+---------+--------------+
|        | GET|HEAD | /        |      | Closure | web          |
|        | GET|HEAD | api/user |      | Closure | api,auth:api |
+--------+----------+----------+------+---------+--------------+

Command route:list giúp ích trong việc đọc tên route và các middleware đi kèm. Ngay sau đây là tip để đặt tên routes.

Đặt tên các Group Routes

Một quy tắc phổ biến trong Laravel đó là đặt tên route, cho phép bạn dễ dàng tham khảo tên route và tránh phức tạp hóa việc code các URI liên quan đến root trong các template của bạn. Trong một số app thì các URI khó code vẫn chấp nhận được, còn một số trường hợp khác, các route được đặt tên sẽ cho phép những cái như sau:

{{ route('admin.users.show', ['user' => $user]) }}
{{-- /admin/users/2 --}}

Khi bạn đang xác định một nhóm route, ví dụ như về admin, bạn cũng có thể gán một tiền tố (prefix) cho tên của route trong nhóm như sau:

Route::namespace('Admin')
    ->prefix('admin')
    ->name('admin.')
    ->group(function () {
        Route::resource('users', 'UsersController');
    });

Tên được gán tiền tố như trên sẽ tạo ra các tên route cho resource controller users như dưới đây:

  • admin.users.index
  • admin.users.store
  • admin.users.create
  • admin.users.show
  • admin.users.update
  • admin.users.destroy
  • admin.users.edit

Tham khảo thêm

Xem đầy đủ tài liệu routeresource controller section. Còn rất nhiều các hướng dẫn thực hiện ứng dụng thực tế dựa trên Laravel tại đây nhé. Hiện tại các việc làm IT lương cao liên quan đến Laravel cũng được các doanh nghiệp tuyển dụng rất nhiều.

  Laravel 5.6 đã lên sóng, và đây là những điểm mới nổi bật nhất!

TopDev via Laravel News

10 Bí quyết tuyển dụng giúp bạn tăng tỉ lệ nhận offer tức thì!

Trong khi có vô vàng cơ hội việc làm rộng mở cho những các ứng viên có background khủng đang được săn đón, đây lại là nỗi khổ của các công ty đang tìm nhân lực. Các tổ chức của mọi ngành nghề đang chìm trong sự khan hiếm người tài, và phải liên tục cạnh tranh trong cùng một talent pool. Thậm chí chỉ để lọt vào tầm ngắm của ứng viên, bạn phải thực hiện cả một quá trình. Trên thực tế thì, nếu một ứng viên từ chối offer của bạn, thì bạn có làm gì để tiếp cận họ đi chăng nữa cũng quy về số 0.

Bạn có thể áp dụng các phương pháp sau để cải thiện mối quan hệ với ứng viên, thương hiệu của công ty bạn, và quan trọng là cải thiện tỉ lệ chập nhận offer.

1. Xem ứng viên như khách hàng của mình.

Có thể bạn đã đọc nhiều về nó, nhưng hãy xem xem nó trông như thế nào trên thực tế. Bắt đầu quá trình thật nhẹ nhàng và tìm xem các yếu tố ưu tiên với họ (chế độ lương thưởng, thăng tiến sự nghiệp, nhiệm vụ). Nếu cuộc gọi phỏng vấn đầu tiên ổn thỏa, hãy mời họ đi cafe hoặc đi ăn trưa và làm quen với họ trước khi tìm hiểu sâu về họ. Tôn trọng thời gian của họ bằng cách rõ ràng về thời gian và buổi phỏng vấn. Hãy nhắn nhủ giám đốc tuyển dụng của công ty bạn làm điều tương tự. Giám đốc sale chắc chắn sẽ không đi tham dự một cuộc họp 15 phút trễ. Nó cũng tương tự như buổi phỏng vấn.

2. Đơn giản hóa process.

Các ứng viên không chủ động có rất ít thời gian để tìm hiểu các cơ hội mới và cũng sẽ có ít động lực để tham gia vào hẳn một process tuyển dụng, đặc biệt là khi so với một ứng viên chủ động hơn. Vượt qua các rào cản và những bước không cần thiết sẽ làm tăng khả năng tuyển được người tài cho công ty bạn.

3. Training cho hội đồng interviewer.

Việc tối thiểu cần làm đó là mở một cuộc họp kickoff phổ biến vai trò để đảm bảo rằng tất cả mọi người trong dàn phỏng vấn hiểu được vai trò của mình trên tổng thể và quan trọng nhất là, vai trò của họ cụ thể trong quá trình tuyển dụng. Buổi họp kickoff này sẽ giúp loại bỏ các câu hỏi trùng lặp – cách nhanh nhất để làm ứng viên từ chối offer.

4. Tập trung vào các giá trị cốt lõi chung cũng như những phẩm chất riêng.

Một nền văn hóa chia sẻ là một trong những ưu tiên hàng đầu của người tìm việc (thường là chỉ đứng sau tiêu chí thăng tiến trong sự nghiệp). Hãy trở thành một option hàng đầu và lí tưởng cho ứng viên bằng cách thể hiện văn hóa công ty từ sớm, để đảm bảo cả hai đều đang song song với nhau.

5. Làm cho buổi phỏng vấn như một cuộc trò chuyện.

Thay vì chỉ là một buổi phỏng vấn toàn các câu hỏi về hành vi, hãy phá cách một chút và biến nó giống như 1 cuộc hội thoại. Các câu hỏi như “Bạn nghĩ thế nào về project ‘X’ mới đây của chúng tôi?” có thể làm câu chuyện trở nên hứng thú hơn. Việc thay đổi này tạo cho ứng viên một khoảng nghỉ giữa các câu hỏi chính chuyên và cho họ một cơ hội để chia sẻ ý kiến của mình về các project, process và những thứ hiện tại của công ty đang thực hiện.

6. Làm cho vị trí xứng với giá trị của họ.

Offer của bạn sẽ trở nên quyền lực hơn nếu nó có offer cơ hội phát triển xa hơn và những nhiệm vụ mới. Khi bạn gặp nhà tuyển dụng lần đầu để bàn về profile ứng viên, hãy cân nhắc tìm hiểu những talent nổi trội trước.

7. Đầu tư vào trải nghiệm số.

Ấn tượng đầu tiên về công ty của ứng viên thì không còn chỉ về một người hay một cuộc gọi, mà nó nằm ở trang web của họ. Hãy xem đây như một cơ hội để tạo một ấn tượng thật sáng tạo và nổi trội trong mắt ứng viên. Hãy vượt qua khuôn khổ một trang web thông thường và cho một video phác họa “một ngày tại công việc”. Nó làm cho ứng viên cảm thấy gắn kết nhanh hơn và được chuẩn bị tinh thần.

8. Sử dụng đúng lúc các test/ bài tập với ứng viên.

Đừng làm ứng viên choáng ngợp quá sớm với các project, thử thách code, hoặc bài tập về nhà. Quan trọng là thời điểm, và thời gian thích hợp nhất là đến khi giai đoạn sau của quá trình tuyển dụng, vì lúc đấy cả hai đều đã khá hiểu nhau. Nếu ngay từ đầu đã có coding challenge thì đây là con đường ngắn nhất để ứng viên từ chối offer.

9. Tạm rời email và dùng điện thoại.

Đây là điểm để tạo sự khác biệt trong mắt ứng viên, đặc biệt là khi bạn cung cấp các thông tin không hay, ví dụ như team bạn sẽ cân nhắc ứng viên khác cho vị trí đó. Tác phong đưa feedback ngay không phải qua email lại là thứ vị bỏ qua trong thời đại số.

10. Đo lường thất bại và thành công của mình.

Bạn không thể cải thiện những cái bạn không đo đạc. Hãy bắt đầu áp dụng cá khảo sát trải nghiệm ứng viên và track điểm NPS để có một cái nhìn thực tế về những gì bạn đang làm. Thời điểm tốt nhất để thực hiện là sau buổi phỏng vấn onsite đầu tiên trước bất kì thông tin nào về bước tiếp theo để tránh các kết quả sai lệch.

TopDev via Ere Media

Con đường trở thành một Senior developer đích thực

Con đường trở thành một Senior developer

Sau những năm tháng làm việc từ một fresher dev đã đưa tôi trở thành cổ đông của một công ty phần mềm, tôi đang làm việc và dẫn dắt rất nhiều kĩ sư trẻ tuổi. Câu hỏi tôi nhận được rất nhiều đó là làm sao để trở thành senior developer? Câu hỏi này không đơn giản, mỗi nơi có một định nghĩa về senior khác nhau. Tuy nhiên từ kinh nghiệm cá nhân làm việc tại nhiều công ty, tôi phát hiện ra rằng việc trở thành senior dev không chỉ ngừng ở việc thành thạo các tool nhất định. Thật ra, bạn phải có khả năng đưa ra quyết định, đưa ra những ước tính chính xác, và nhiều thứ khác nữa. Dưới đây là những điều mà các dev trẻ tuổi cần để phát triển sự nghiệp của mình, có thể các dev đã từng trải sẽ thấy nó quá bình thường, list này sẽ tóm tắt những gì tôi tìm và nghe được.

Project

1) Biết đâu là ưu tiên và theo nó đến cùng:

Đơn giản hơn là: Tưởng tượng bạn đang xây một căn nhà, theo to-do list thì bạn cần phải lắp toilet và sơn khung cửa sổ. Dĩ nhiên, mọi thứ trong list này đều cần được hoàn thành. Nhưng một căn nhà có thể ở được thì không thể thiếu toilet được, còn khung cửa sổ thì có thể không. Đây có thể là một ví dụ nhảm nhí và tranh cãi rằng đã sẵn có project plan và budget rõ ràng, nhưng trên thực tế plan có thể thay đổi và budget có thể bị cắt giảm. Ý tưởng ở đây là phải biết rõ cái gì quan trọng nhất vào thời gian nhất định và đảm bảo phải hoàn thành nó.

2) Tránh giả định và đặt các câu hỏi hợp lý:

Giả định là nguồn gốc của nhiều vấn đề và cái đáng ghét nhất đó là nó hoàn toàn có thể tránh được. Bạn cần phải tìm hiểu kĩ những thứ mình không biết và hỏi rõ ràng để tránh mơ màng. Ví dụ, tưởng tưởng ai đó hẹn gặp bạn tại Starbucks lúc 8 giờ, thì bạn phải hỏi những câu hỏi rõ ràng như chi nhánh Starbucks nào và hẹn lúc 8 giờ sáng hay 8 giờ tối. Tóm lại, bạn sẽ không rơi vào tình huống tự khiển trách bản thân đã không hỏi rõ.

3) Phân tích trước khi code:

Khi còn trẻ, chúng ta thường muốn thể hiện và viết code nhanh nhất có thể. Tuy nhiên, thật ra nghĩ kĩ trước khi build cái gì đó sẽ nhanh hơn, kể cả khi phải vẽ một vài biểu đồ ra trước, nhưng chúng đều giúp chúng ta có cái nhìn rõ hơn về nó và trả lời các câu hỏi cần thiết. Từ đó bạn có thể viết code an toàn hơn.

4) Đưa ra những quyết định đúng đắn:

Ý tôi nói đến trong những tình huống làm việc chuyên nghiệp. Đầu tiên, liệt kê hết các yếu tố ảnh hưởng đến quyết định của bạn, ví dụ như: implementation như thế nào, trải nghiệm với technology, performance, cost, etc. Một khi đã liệt kê hết các yếu tố, hãy làm tương tự với các option khác. Bây giờ bạn cần phải phân tích các option ra, có thể dùng các technique đơn giản như Pugh Matrix để so sánh giữa các option và support các quyết định bạn đã chọn.

5) Hiểu khách hàng:

Tôi quen nhiều người làm việc với codebase mà không có cả kiến thức lẫn quan tâm đến vấn đề cần giải quyết. Theo tôi, chúng ta gọi đó là những code monkeys và trong tương lai không xa sẽ bị thay thế bởi robot. Khi bạn quan tâm, và mọi người lắng nghe bạn, và hỏi ý kiến từ bạn và trân trọng nó. Và từ đó dần dà, trách nhiệm tăng, và kể cả các cơ hội và giá trị của bạn, và đương nhiên cả ví cũng dày lên.

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

Teamwork

6) Đừng ngại hỏi:

Tôi hiểu rằng bạn sẽ không muốn trở thành một người vô tâm trong mặt bạn bè hoặc tech lead, nhưng có một sự thật là một team tốt rất cần phần mềm được hoàn thiện đúng dead, và ghét tất cả những trì hoãn và nguyên nhân của nó. Vì thế họ có thể còn thất vọng về bạn hơn nhiều nếu bạn không chịu hỏi, và project sẽ bị trì hoãn, hơn là hỏi cái gì đó kì quặc nhưng hiểu chuyện và học được bài học.

7) Đừng ngại nộp task:

Giao nộp task có thể như một trải nghiệm kinh hoàng nếu bạn là người học việc, nhưng hãy nhớ rằng, chúng ta được trả lương để hoàn thiện product, đơn giản và nhanh chóng. Vì thế, thay vì cố kiếm cớ trì hoãn task: nộp, thương lượng về hậu quả, học từ thất bại và thành công, cải thiện và lặp lại đến khi bạn không còn sợ nữa.

8) Tôn trọng những đồng đội nhiều kinh nghiệm hơn mình:

Đôi khi bạn sẽ bất đồng với những quyết định của tech lead đưa ra, điều đó không sao cả, nhưng trước khi bạn nổi đóa lên tại sao người đó lại sai, tôi đề xuất một cách giải quyết khác: Hỏi xem tại sao họ lại quyết định như vậy, xem và hiểu được bức tranh toàn cảnh, có lẽ có những khuất mắt mà bạn chưa biết. Nói chung việc bạn hiểu cả quá trình ra quyết định của họ vẫn là tốt hơn.

  Quy tắc 333 hay là phiếm đàm về chuyện phỏng vấn Senior Developer

9) Cân bằng giữa việc tuân lệnh và bất tuân:

Để làm rõ tôi sẽ kể một câu chuyện nhỏ. Tôi đang làm một project với tư cách Business Analyst và một trong những nhiệm vụ của tôi là viết một số quy trình lưu trữ. Acceptance test của khách hàng được thực hiện tại Trung Quốc và tech lead của chúng tôi phải đến đó để thực hiện bài test. Khoảng một tuần trước khi ra mắt thị trường của test user, tech lead bảo tôi business rule đã sai và cách fix nó. Cái anh ấy nói khiến tôi thấy không hợp lí và tôi đã đã phản hồi anh ấy một cách đầy tôn trọng, và anh ấy vẫn nhấn mạnh rằng tôi nên thay đổi quy trình thì tôi nói anh ấy muốn điều gì thì hãy email. Tất nhiên tôi buộc phải làm theo nhưng không quên tạo backup cho code cũ để có thể lấy ngay khi cần. Một tuần sau, khi test tại Trung Quốc thì nó không pass được bài test và tôi nhận được cuộc gọi từ team lead hỏi tại sao nó lại như vậy và ai phụ trách. Tôi đã rất lịch sự rep lại rằng là anh ấy và forward lại mail cho anh ấy. Khoảng 30 giây sau anh ấy hỏi tôi xem thay đổi nó có tốn nhiều thời gian không. Và ngay lúc đó tôi lấy bản backup ra. Mục đích của câu chuyện đó là đôi khi boss của bạn có thể sai, và trong những tình huống như vậy bạn nên hỏi xác nhận qua email hoặc bất kì phương tiên theo dõi được và có thể suggest luôn giải pháp. Vì thế, trong trường hợp có vấn đề phát sinh bạn sẽ an toàn. Bạn có thể nghĩ nó không cần thiết nhưng đôi khi các sếp có thể nổi đóa lên, nên tôi đề nghị nên suy nghĩ cẩn thận về nó.

10) Trả lời email:

Làm ơn nhớ việc này, đôi khi không nhất thiết phải trang trọng nghiêm túc mà chỉ cần Thank you! hoặc xác nhận bạn đã nhận mail là đủ, và nó sẽ khác xa rất xa so với việc không rep mail.

TopDev – Việc làm IT giành cho Senior Developer

Vì sao tôi chuyển từ Visual Studio Code sang Sublime Text

vi-sao-toi-chuyen-tu-visual-studio-code-sang-sublime-text

Mới đây tôi mới đổi code editor chính của mình sang Sublime Text. Một năm vừa qua tôi sử dụng Visual Studio Code để viết code. Cả hai editor rất giống nhau nhưng cũng có những điểm khác biệt quan trọng làm tôi chuyển sang sử dụng Sublime. Note: bài viết này hòa toàn không chê bai phần mềm nào hơn cả. Tôi chỉ đưa ra những quan điểm thật lòng từ những trải nghiệm cá nhân, còn việc chọn code editor là một quá trình rất chủ quan, nên mỗi người sẽ có mỗi quan điểm khác nhau về nó.

Điều gì làm tôi thay đổi 

Phân tích các Symbol chính

Khi bạn mở một project trong Sublime Text, nó sẽ tự động mở một trình gọi là trình “phân tích symbol” một từ mỹ miều để nói về việc tìm keywords trong code của bạn. Điều hay về nó là khi tôi type Cmd + Shift + R để mở menu tìm symbol và nhanh chóng tìm ra các class names và methods trong code của mình. Hầu hết thì tôi là việc với PHP nên ví dụ, nếu như tôi đã biết class name mà tôi đang làm là PostController, tôi có thể search và nó trong symbol search và file chứa class PHP sẽ lập tức mở trong editor.

VS Code cũng có hỗ trợ symbol searches, tuy nhiên, nó chỉ hỗ trợ vài ngôn ngữ nhất định. Nó là một third-party PHP symbol analyzer trong VSCode, nhưng với codebase to to một chút là sẽ có vấn đề, trong khi Sublime thì không.

Tốc độ cực nhanh

Sublime Text là text editor nhanh nhất tôi từng sử dụng. Nó mở gần như ngay tức thì và search rất nhanh. Microsoft đã rất cố gắng làm VS Code vận hành hiệu quả, tuy nhiên, VS Code dựa trên Electron. Electron là một JS framework và code bạn được viết trên JavaScript/Node.js, nói trắng ra đây là một cross platform framework. Nó làm cho editor dễ dãng mở rộng, nhưng bạn biết rồi đó, cross-platform framework khi khởi động cần chạy nhiều lib hay extension gắn liền với nó làm cho app khởi động rất chậm và sử dụng nhiều bộ nhớ hơn. Sublime Text là một app được viết native trên C++ hoàn toàn, nên footprint cũng thấp hơn nhiều.

Các Vim Binding tốt hơn

Tôi rất thích các Vim key bindings khi viết code. Dù tôi rất thích các Vim keyboard shortcuts, tôi vẫn muốn dùng text editor tiêu chuẩn hơn để dùng các features mới như sidebar file lists và file tabs. Tôi phát hiện ra rằng Vim support của Sublime chính xác hơn VS Code, giúp tôi viết code nhanh hơn một chút. Sublime hỗ trợ Vim bindings bên ngoài, nhưng bạn còn có thể sử dụng nhiều features hơn nữa nếu bạn dùng Vintageous plugin.

  10 theme Sublime Text tốt nhất

Những điều tôi bỏ lỡ trong Visual Studio Code

Feature Rich Sidebar

VS Code có phần sidebar rất tốt giúp ta tạo và chuyển file linh hoạt hơn. Sublime cũng có một plugin làm sidebar tốt hơn và các keyboard shortcut plugins khác như AdvancedNewFile giúp việc di chuyển mượt mà hơn, nhưng thật lòng thì tôi vẫn bõ lỡ nhiều feature của VS Code sidebar.

Debugger có sẵn

VS Code có một debugger cài sẵn sử dụng được cho rất nhiều ngôn ngữ. Nó giúp ta sử dụng xdebug của PHP rất đơn giản. Mặc dù Sublime cũng có debugging plugins, nó không được ok như những gì VS Code cung cấp. Trong trường hợp này, tôi vẫn hay mở VS Code nếu như phải debug cái gì đó phức tạp.

  Sublime Text là gì? Hướng dẫn cài đặt Sublime Text 3 chi tiết

Kết luận

Tóm lại, text editor là phạm trù thuộc về chủ quan mỗi người và tính chất công việc. Nếu bạn có phát hiện gì hay của cả 2 editor thì chia sẻ với tôi nhé.

TopDev

Tham khảo việc làm Business Analyst lương cao trên TopDev

Các JavaScript charting libraries tuyệt vời có thể bạn đã bỏ lỡ

Có thể bạn đã biết đến D3.js và Google Charts. Tuy nhiên còn rất nhiều thứ khác bạn chưa biết đến. Tôi sẽ list ra một vài JavaScript charting libraries mà tôi tìm được trên Github và nhiều nguồn khác trên web :

Frappe Charts

  • Size: 56.1 KB (không gzipped)
  • SVG Based
  • Responsive
  • MIT License

Screenshot 2018-03-31 14.21.37.png

Tip: Check bản Month-wise Heatmap demo.

Chartist.js

  • Size: 39.3 KB (not gzipped)
  • SVG Based
  • Responsive
  • Bằng MIT

Screenshot 2018-04-02 00.35.37.png

echarts

Đây là các canvas theo visualization library.

  • Size: 691 KB (không gzipped)
  • Canvas Based
  • Responsive
  • Apache License 2.0

Screenshot 2018-04-02 00.41.58.png

recharts

Một charting library được build dựa trên React components

  • Size: 508 KB (not gzipped)
  • SVG Based
  • Not Responsive
  • MIT License

Screenshot 2018-04-02 00.51.35.png

c3

  • Size: 182 KB (not gzipped)
  • SVG Based
  • Responsive
  • MIT License

Screenshot 2018-04-02 00.57.03.png

nvd3

  • Size: 268 KB (not gzipped)
  • SVG Based
  • Không Responsive
  • Custom License

Screenshot 2018-04-02 01.00.15.png

shutterstock/rickshaw

Rickshaw là một toolkit JavaScript được build bằng d3.js để tạo ra các interactive time series graphs.

  • Size: 78 KB (not gzipped)
  • SVG Based
  • Responsive
  • MIT License

Screenshot 2018-04-02 01.03.36.png

dc.js

  • Size: 86.7 KB (not gzipped)
  • SVG Based
  • Không Responsive mặc định
  • Apache License

Screenshot 2018-04-02 01.08.22.png

victory

Các React.js component dành cho modular charting và data visualization.

  • Size: 512 KB (not gzipped)
  • SVG Based
  • Responsive
  • MIT License

Screenshot 2018-04-02 01.09.36.png


TopDev via Hashnode

Nếu bạn là chuyên gia trong Javascript, TopDev – Việc làm IT cho top developers luôn có những công ty lớn mong chờ bạn tham gia, lương lên đến $3000.

  5 cách chia một mảng lớn thành nhiều mảng nhỏ trong Javascript
  12 thủ thuật hữu ích trong JavaScript

3 workhack để duy trì năng lượng tích cực tại công sở cho kĩ sư phần mềm

Mặc dù vị trí kĩ sư phần mềm là một vị trí đáng mơ ước với nhiều người, nhưng trên thực tế thì đây là một công việc rất vất vả đòi hỏi hàng tiếng đồng hồ dưới đèn led, máy lạnh “âm độ” và bị “cách ly” với ánh nắng mặt trời. Nói cách khác, viết được một dòng code đơn giản cũng là cả một nghệ thuật và chính vì thế mà nó đòi hỏi nhiều cảm hứng, sự tập trung và nhiều năng lượng bỏ ra đó. Trong bài viết này tôi sẽ cố gắng giải thích cho bạn một cách dễ hiểu nhất cách để cân bằng giữa duy trì năng lượng tích cực trong môi trường làm việc căng thẳng.

1. Tìm cách giải quyết tiêu hao năng lượng 

Tôi vừa mới quay lại làm việc sau 3 tháng có đứa con đầu tiên. Đứa bé vẫn thường thức giấc vài ba lần vào giữa đêm còn tôi thì gần như kiệt sức. Nó gần như đạt đến đỉnh điểm nên tôi không tự chạy xe nữa để tránh xảy ra tai nạn. Cứ nghĩ về chuyện quay lại chốn công sở với những hoạt động bình thường giống như đi đóng phim “Mision Impossible” . Vì thế tôi quyết định tìm hiểu thói quen hàng ngày của mình và tìm cách tránh tiêu tốn năng lượng quá mức.

Tôi đã nắm được khung giờ năng suất nhất trong ngày của mình đó là vào buổi sáng. Chính vì thế tôi phải đảm bảo rằng buổi sáng phải tràn trề năng lượng và phải sử dụng chúng hợp lý.

Khi tôi list ra lịch trình buổi sáng của mình, tôi phát hiện ra rằng tôi đã dùng rất nhiều năng lượng kể cả trước khi đến văn phòng. Mọi ngày tôi dậy lúc 5h để cho con ăn, thay đồ cho con, tự chuẩn bị, rồi đưa bé đến nhà trẻ rồi đến công ty. Khi tôi đến nơi là 8h, thì năng lượng lúc đó đã cạn.

Đây là những kinh nghiệm đối với những người có gia đình như tôi, nếu bạn còn độc thân thì không cần xem qua đoạn này cũng được. Tôi đang cân nhắc về việc bắt xe bus (hoặc bắt Grab) đi đến công ty thay vì tự chạy xe, việc đưa đón con tôi đành phải nhờ ông nội đưa đi, thay vì hối hả trong dòng xe kẹt cứng, tôi lại ngồi thong dong nghe nhạc hoặc đọc sách để tranh thủ nghỉ ngơi. Giá cả sẽ cao hơn rất nhiều – khoảng 5.000 VND (Grab thì nhiều tiền hơn) mỗi lượt, tính ra nó mắc hơn tự đi xe. Nhưng khi tôi nhận ra rằng chi phí này để đổi lấy một ngày làm việc hiệu quả hơn, là khá hợp lý. Nhìn vào tổng giá trị nhận được sau cùng thay vì chỉ nhìn vào giá tiền của mỗi chuyến đi, tôi cũng đã bắt đầu bắt Grab nếu cần đi đâu đó – meetup, khóa học và hội nghị mà trước đây tôi không thể đi.

Tóm lại: check xem thời gian năng suất nhất trong ngày của mình, phân tích xem năng lượng tiêu tốn vào những việc gì và tìm cách giải quyết những phần dư thừa bằng cách tập trung vào bức tranh toàn cảnh chứ không phải là hành động nhỏ lẻ.

2. Hãy cho bản thân nghỉ ngơi

Một trong những đồng nghiệp của tôi không bao giờ nghỉ. Hoàn toàn không. Anh ấy đến sớm và ra về vào 7h. Đôi khi còn tiếp tục làm việc tại nhà. Thậm chí có những ngày anh ấy không nghỉ trưa nữa. Ảnh chỉ vớ đại bất cứ cái gì rồi ăn tại bàn trong khi đang làm việc hoặc chạy đến quán ăn gần nhất, mua đại cái gì rồi về công ty ngay. Có rất nhiều manager cũng có thói quen tương tự.

Một trong những mặt tối nhất của nghề này đó là năng lực nhân viên vẫn được đánh giá dựa trên lượng thời gian làm việc chứ không phải theo hiệu suất. Nghiên cứu gần đây cho thấy nghỉ ngơi rất có lợi cho não: nó tăng tính sáng tạo, cải thiện sự tập trung và giữ mình khỏe mạnh vì cơ thể chúng ta không được “lập trình” để ngồi cả ngày.

Vì thế để giữ cho mức năng lượng luôn cao, lần tới nếu như bạn mệt mỏi, không thể tập trung hoặc ngập trong bug quá lâu, tiếp tục làm việc chỉ làm bạn thêm chán nản thôi. Hãy cố gắng nghỉ ngơi và bug có thể chạy đi đâu mất trước khi bạn kịp để ý.

Thư giãn không có nghĩa là ngừng làm việc. Thực chất nó nghĩa là để cho não nghỉ ngơi. Trong thời gian nghỉ ngơi hãy làm gì đó giúp não bình tĩnh ví dụ như hít thở đều, nghe nhạc, uống một ít trà xanh, tập một vài động tác giãn cơ, thậm chí có thể tắm hoặc ngủ một giấc ngắn nếu có thể.

shift between different tasks

3. Luân chuyển giữa các task khác nhau

Nghề kĩ sư phần mềm phụ trách rất nhiều task đòi hỏi rất nhiều skill khác nhau: check mail, viết code, testing, nói chuyện với cổ đông, học topic mới, review code, gỡ bug, viết tài liệu, thiết kế feature,…

Nếu bạn đang làm một task chỉ yêu cầu một skill nhất định và bạn cảm thấy như bị cạn dần năng lượng, hãy chuyển sang một task khác đòi hỏi skill khác, nó giống như việc cho một phần của não được nghỉ ngơi vậy. Vì thế bạn có thể linh hoạt chuyển task để cho phần não đã hoạt động từ đầu nghỉ ngơi và có thể quay lại task đó.

Ví dụ như nếu bạn đã code ròng rã 2 tiếng và bắt đầu cạn lực, hãy chuyển sang nói chuyện với đồng nghiệp hoặc check mail. Nếu bạn đang học một topic mới và cần nghỉ ngơi, bạn có thể chuyển sang review code hoặc debug lỗi. Một hồi sau bạn có thể quay lại task ban đầu bạn sẽ thấy năng lượng tràn trề khác hẳn.

Tóm lại, để duy trì năng lượng tích cực trong một công việc căng thẳng cao như nghề kĩ sư phần mềm, hãy làm theo 3 bước: Tìm giải pháp tránh tiêu tốn nhiều năng lượng bằng cách tập trung vào bức tranh lớn, nghỉ ngơi và làm gì đó để giảm căng thẳng cho đầu óc, và luân chuyển nhiều task để cho một phần não bộ được nghỉ ngơi.

Khi bạn đã thử hết các cách mà mọi chuyển vẫn dẫm chân tại chỗ, hay quá chán nản công việc hiện tại mặc dù đã đổi mới các cách làm việc, thì tôi nghĩ đã đến lúc bạn hãy tìm cho mình một thử thách mới để có động lực hơn. Tại TopDev – Việc làm IT cho top developers luôn có hàng ngàn thử thách chờ bạn accept.

  Lập trình viên vượt qua rào cản bất lực bằng cách nào?
  6 điều tôi vỡ lẻ khi tự học code (P1)

Topdev

Những con số biết nói trong ngành di động

Công nghệ di động – thuật ngữ không còn xa lạ trong cộng đồng người dùng điện thoại thông minh (Smartphone) hiện nay. Số liệu từ Nielsen Việt Nam cho biết tỷ lệ người dùng smartphone so với người dùng điện thoại phổ thông (feature phone) trong năm 2017 là 84%; tăng 6% so với năm 2016 (78%) và ước tính sẽ tăng 20% trong năm tiếp theo. Đây là một dấu hiệu tích cực cho toàn ngành vì smartphone không chỉ là vật bất ly thân của những người bận rộn mà còn dần trở thành những chiếc laptop “cầm tay” hỗ trợ mọi nhu cầu ngày càng ngày càng cao của người dùng.

Công nghệ di động, từng bước nâng tầm như thế nào?

Nền công nghệ 4.0 cho thấy thiết bị di động nhỏ bé nhưng sức ảnh hưởng không hề nhỏ, những năm gần đây sự dung nhập của công nghệ vào ngành di động càng khiến cả hai ngành trở nên nổi trội hơn. Công nghệ di động không chỉ dừng lại ở các ứng dụng mà còn trở thành nguồn lực phát triển mạnh mẽ của nhiều ngành nghề khác nhau. Có thể thấy như:

  • “Việt Nam đang tham gia “cuộc chơi” thương mại điện tử với phong độ tốt, nắm bắt hầu hết các xu thế của khu vực”, iPrice đánh giá. Từ khi thương mại điện tử Việt Nam chào đón Alibaba thông qua ứng dụng thanh toán AliPay, ứng dụng di động mua sắm trực tuyến Shopee, Lazada,… tạo nên dấu hiệu phát triển tích cực về thị trường thương mại điện tử Việt Nam như người dùng bắt đầu có thói quen mua sắm trực tuyến qua thiết bị di động nhiều hơn.
  • Kéo theo đó là sự chuẩn bị chu đáo từ các doanh nghiệp không muốn mình bị chôn vùi trong “cơn lốc” công nghệ vì hiện nay có đến 72% lượng truy cập website thương mại điện tử đến từ di động. VECOM còn cho biết trong số các doanh nghiệp có website phiên bản di động hoặc ứng dụng bán hàng, có tới 41% doanh nghiệp đã cho phép người mua thực hiện toàn bộ quá trình mua sắm trên thiết bị di động, 29% có triển khai chương trình khuyến mại dành riêng cho khách hàng sử dụng thiết bị di động để mua sản phẩm và 49% doanh  nghiệp có nhận đơn đặt hàng qua ứng dụng bán hàng trên thiết bị di động.
  • Không dừng lại ở đó, công nghệ di động còn trở thành bệ phóng mạnh mẽ cho các ngành nghề khác như: Fintech – được xem là cơ hội nhiều hơn là thách thức, đặc biệt theo Pwc Việt Nam, tỷ lệ hợp tác với các doanh nghiệp cung cấp dịch vụ thanh toán trực tuyến đã tăng lên mức 42% (cao hơn mức 35% năm ngoái).; Digital marketing – năm 2017, theo Adsota ngân sách quảng cáo cho nền tảng di động đạt tới 78.7 triệu dollar Mỹ, tương đương 36.6% tổng chi tiêu quảng cáo trực tuyến tại Việt Nam; …

Những dữ liệu trên cho thấy rõ được sự phát triển chóng mặt của toàn thị trường mobile tech tại Việt Nam. Cùng thời điểm đấy, cộng đồng công nghệ cũng đã sôi sục trở trở lại với sự kiện VIETNAM MOBILE DAY sắp diễn ra tại 2 thành phố lớn nhất TP.HCM 28/08 và Hà Nội 30/08. Được diễn ra lần thứ 8, sự kiện được giới chuyên môn đánh giá là một diễn đàn rất hữu ích giúp kết nối tất cả các doanh nghiệp lớn nhỏ trên cả nước. Năm 2017 vừa qua, Vietnam Mobile Day đã quy tụ được hơn 200 doanh nghiệp quốc tế và Việt Nam, thu hút hơn 8000 nguồi tham dự  chuỗi sự kiện của mình.

Sự kiện quy tụ nhiều chuyên gia công nghệ đứng đầu ngành.

Cập nhật những xu hướng công nghệ mới nhất trong năm

Để hệ sinh thái công nghệ phát triển một cách bền vững, những sự kiện mang tính chất kết nối mạng lưới các chuyên gia công nghệ, doanh nghiệp, lập trình viên càng trở nên thiết yếu, Vietnam Mobile Day được xem là chuỗi sự kiện nổi bật nhất toàn ngành mobile mang sứ mệnh cao cả này.

Ông Nguyễn Ngọc Dũng, Phó chủ tịch Hiệp hội VECOM từng nhấn mạnh: “Các doanh nghiệp muốn thành công cần theo sát những xu hướng thương mại di động mới nhất để giữ vững lợi thế cạnh tranh trong kinh doanh. Nếu website của doanh nghiệp có sự tương thích đối với thiết bị di động, doanh nghiệp sẽ bảo đảm được khả năng hiện diện trước nhiều khách hàng hơn và khả năng cạnh tranh trên thị trường của doanh nghiệp cũng được nâng cao”

Đến với VIETNAM MOBILE DAY, cộng đồng công nghệ sẽ được cập nhật hơn 100 chuyên đề mới nhất trong ngành Mobile hiện nay chia thành 5 nhóm chủ đề chính: Future of Fintech; Blockchain; Mobile App and Game – Red ocean strategy; AI world domination; The future of Marketing. Sự kiện mang lại một sân chơi hấp dẫn, phong phú, thu hút hơn 10.000 người tham dự; với hơn 200 doanh nghiệp lớn nhỏ hoạt động trong ngành công nghệ thông tin và hơn 100 đơn vị truyền thông trên khắp cả nước tham gia, chắc chắn đây sẽ là một bữa tiệc thịnh soạn dành cho cộng đồng lập trình, doanh nghiệp và khởi nghiệp quan tâm đến lĩnh vực công nghệ.

THÔNG TIN CHI TIẾT VỀ SỰ KIỆN
Website: http://mobileday.vnFanpage chính thức: https://www.facebook.com/mobiledayevent/Hãy nhanh tay đăng kí những chiếc vé EARLY BIRD đầu tiền. Số lượng có hạn! Nhập ngay mã VMDEARLYBIRD khi đăng kí tại: https://meetup.vn/e/JaK để được giảm ngay 100.000 VNĐ cho mỗi vé hạng Standard.

Về các hạng mục hợp tác tại sự kiện:
Mr. Khiêm Phạm
Mobile:  0902 951 296
Email: khiem.pham@applancer.net

Tổng quát về sự kiện:
BTC
Điện thoại: 84-28 62645022 | 84-28 62733496 | 84-28 62733497
Email: event@applancer.net

 

Vietnam Mobile Day đã chính thức quay trở lại!!

Những số liệu, chiến lược và công nghệ nóng nhất ngành sẽ được đem đến tại kỳ Vietnam Mobile Day lần thứ 8 lần này

Với hơn 9 ngàn lượt người tham dự hàng năm, Vietnam Mobile Day được biết đến như ngày hội thường niên lớn nhất trong toàn ngành công nghệ. Sự kiện được giới chuyên môn đánh giá là một diễn đàn cung cấp đầu đủ những kiến thức mới nhất, chuyên sâu nhất từ các diễn giả là chuyên gia được chọn lọc mời từ các công ty Internet tiên phong, đối tượng tham dự đa dạng từ các Developer, Marketer đến các Designer và doanh nhân.

Đừng bỏ lỡ cơ hội tham gia và giao lưu với những Decision Maker của ngành công nghệ. Nắm bắt những thông tin và xu hướng mới chính là chiếc chìa thành công cho bất kỳ ai hoạt động trong lĩnh vực này.

Những kiến thức bạn sẽ được cập nhật “tận răng” trong lần VIETNAM MOBILE DAY 2018:

👉What is the future of Fintech?

👉Blockchain: Bubble or Revolution.

👉Mobile App and Game: All about the red ocean strategy.

👉AI world domination? Real or fiction?

👉The future of Marketing.

Và còn rất nhiều những điều thú vị nữa đang chờ đón các bạn. Hãy truy cập và theo dõi tại website hoặc fanpage của Vietnam Mobile Day để cập nhật những thông tin mới nhất nhé!

💥THÔNG TIN CHI TIẾT

Website: http://mobileday.vn/

Event Page: https://www.facebook.com/mobiledayevent/

💥HOTLINE/ LIÊN HỆ HỢP TÁC:

– event@applancer.net (Event team) | 028 6273 3497 – 028 6681 3236

– khiem.pham@applancer.net (Mr. Khiêm) | 0902 951 296

 

Imatis – làn gió công nghệ mới trong dịch vụ chăm sóc sức khỏe y tế

Internet of thing (IoT) có rất nhiều ứng dụng trong lĩnh vực chăm sóc sức khỏe, từ giám sát từ xa đến cảm biến thông minh cùng khả năng tích hợp vào các thiết bị y tế. Nó không chỉ có khả năng giúp cho bệnh nhân an toàn và khỏe mạnh mà còn được dùng để nâng cao chất lượng dịch vụ. Có thể nói đây là một hệ thống tiên tiến vốn được xem là chuẩn mực cho các bệnh viện ở nước ngoài.

Với mong muốn đem đến cơ hội chăm sóc ý tế đáp ứng tốt hơn nhu cầu của người dùng Việt Nam và nhận thức được nhu cầu chăm sóc sức khỏe chất lượng cao tại thị trường Việt Nam. Imatis, một trong những công ty chuyên phát triển dịch vụ phần mềm về chăm sóc sức khỏe hàng đầu thế giới, và đang có kế hoạch triển khai dự án ở thị trường Việt Nam. Hôm nay, TopDev có cơ hội được gặp gỡ và trò chuyện cùng đội ngũ chuyên gia của Imatis để hiểu rõ hơn về E-health và tiềm năng của E- health tại thị trường Việt Nam

Việt Nam – thị trường E-health đầy tiềm năng và thử thách

Theo ông Morten Andresen, CEO của Imatis –  công ty chuyên phát triển phần mềm về chăm sóc sức khỏe. Trong đó, hãng tập trung về mảng logistic, quản lí thiết bị cơ sở cũng như là thiết lập đường dây kết nối thông tin dành riêng cho bệnh viên. Với sự tích hợp của machine learning, người bệnh sẽ được hỗ trợ dịch vụ chăm sóc sức khỏe vô cùng tiện lợi.

Imatis hiện đã có mặt tại hơn 30% bệnh viện tại Na Uy. Ngoài ra, Imatis cũng phát triển ra các thị trường như Thụy Điển và Đan Mạch nói riêng cũng như khu vực Bắc Âu nói chung. Không dừng lại đó, công ty hiện đang lên kế hoạch mở rộng chi nhánh tại Việt Nam và các nước trong khu vực Châu Á. Vì vậy, Imatis quyết định hợp tác với OutsourceIt-Facilitated Work Hub, một công ty công nghệ chuyên về cung cấp dịch vụ phần mềm với chi nhánh tại Việt Nam.

Đây là một dự án có rất nhiều ứng dụng khác nhau với mục tiêu nhằm tối ưu hóa quá trình chăm sóc sức khỏe cũng như là bảo đảm quỹ thời gian của bác sĩ được sử dụng hiệu quả. Bên cạnh đó, nhóm phát triển phần mềm tại Việt Nam trực thuộc OutsourceIt-Facilitated Work Hub cũng sẽ chịu trách nhiệm cho những ứng dụng nhỏ đó. Tùy vào yêu cầu của từng bệnh viện mà Imatis sẽ phát triển cũng như chỉnh sửa ứng dụng cho phù hợp.

Ông Morten cũng chia sẻ thêm, Imatis muốn tập trung vào việc phát triển một đội ngũ phát triển phần mềm ngay tại thị trường nội địa cũng như xây dựng nền móng tại Việt Nam. Ngoài ra, công ty cũng lên kế hoạch để cải thiện dịch vụ hỗ trợ cho khách hàng. Bởi khách hàng của Imatis có ở khắp mọi nơi trên thế giới nên dịch vụ xuyên suốt 24/7 là điều bắt buộc.

Một đội ngũ developer tuyệt vời sẽ quyết định tất cả

Đòi hỏi một nguồn nhân lực giỏi ngay tại thì trường nội địa, Imatis cũng rất quan tâm tới quá trình tuyển dụng các developer cũng như chính sách đối đãi phù hợp.

Theo anh Phan Thành Thái, Technical lead của Imatis, với một môi trường làm việc năng động, xuyên quốc gia đây là cơ hội lớn, đồng thời cũng là thách thức không nhỏ đối với các bạn developer.

Để có thể thực sự tỏa sáng ở môi trường làm việc đa văn hóa như ở Imatis các developer sẽ cần phải có khả năng giao tiếp bằng tiếng Anh cũng như có một thái độ làm việc chuyên nghiệp, ham học hỏi. Mặt khác, môi trường văn hóa làm việc là tự quản lí công việc nên quá trình giao tiếp thường diễn ra trực tiếp và mang tính tự giác giữa đôi bên. Do đó, thái độ làm việc đóng vai trò rất quan trọng. Developer sẽ phải tự giác trao đổi để có thể học cách tiếp cận và giải quyết một vấn đề.

Anh cũng cho rằng có 2 khó khăn lớn là khác biệt trong văn hóa cũng như giao tiếp. Các developer Việt Nam khá là rút rè và nhút nhát trong việc đưa ra ý kiến riêng của chính mình, đặc biệt là trong giao tiếp với người nước ngoài. Ngoài ra, kĩ năng giải thích vấn đề cũng là một thách thức cho cả 2 phía khi mà trình độ tiếng Anh của developer Việt Nam vẫn chưa thật sự đồng đều cũng như thuần thục.

Chia sẻ thêm về kinh nghiệm cho những developer newbies muốn nhanh chóng gia nhập được môi trường làm việc đa quốc gia thì đam mê, nhiệt huyết, “cày” hăng say vẫn là chưa đủ. Bởi suy cho cùng hiệu quả công việc mới là yếu tố quyết định chính. Do đó, ngoài kiến thức cơ bản học tại nhà trường thì các bạn developer cũng sẽ rất cần những kĩ năng mềm như cách sắp xếp công việc để bảo đảm chất lượng sản phẩm. Đồng thời, developer sẽ phải cân bằng được giữa làm việc và thư giãn, cũng như có khả năng giao tiếp nhóm để có thể học hỏi từ các anh chị đi trước.

Ngoài ra, khả năng sử dụng tiếng Anh là một trong những yếu tố quan trọng nhất. Với 4 kĩ năng bao gồm đọc, nói, viết và nghe đều phải ở mức khá trở lên. Tất nhiên là bạn có thể nói tiếng Việt thoải mái với các developer Việt Nam khác nhưng mọi thứ liên quan tới công việc cũng như giao tiếp với team Na Uy đều sẽ dùng tiếng Anh.

Thay Lời Kết

Với sự phát triển vũ bão của công nghệ cũng như internet đã mang tới sự đột phá cho nhân loại. Nó không chỉ là về máy tính, laptop, tablet hay smartphone. Các máy giặt, máy hút bụi, ổ khóa cửa, đồ chơi và thậm chí lò nướng bánh mì hiện nay đã trở nên “thông minh” hơn. Tương lai mà chúng ta vẫn hay nghe trong những câu chuyện khoa học viễn tưởng đang dần dần trở thành hiện thực, và người tiêu dùng đang chờ đợi một làn gió mới. Chính vì vậy mà tất cả các lĩnh vực, không riêng gì mảng công nghệ, đều phải tự nâng cấp dịch vụ của mình trong thời đại “IoT” này. Tin rằng không chỉ có Imatis mà vẫn còn rất nhiều công ty công nghệ khác đang cố gắng thay đổi thế giới bằng chính những sản phẩm đầy tiềm năng của họ.

TopDev

Unit testing các component Vue.js bằng các tool Vue testing và Jest (P3): Test các Style and cấu trúc của các Vue.js Component trong Jest

Phần 1: Viết Vue.js Component Unit Test với Jest

Phần 2: Test Vue.js Components deep render trong Jest

vue-test-utils đem đến cho chúng ta một bộ tính năng để xác định các Vue.js component.

Đến hiện tại, các test chúng ta thực hiện đều qua Jest Snapshots. Nó rất tốt, nhưng đôi khi chúng ta cần xác định cái gì đó cụ thể hơn.

Mặc dù bạn có thể access vào một ví dụ của Vue qua cmp.vm, bạn vẫn có một bộ tính năng tùy ý sử dụng để làm nó nhanh hơn. Hãy xem xem chúng ta có thể làm gì.

Wrapper object

Wrapper là một object chính trong vue-test-utils. Đây là một type trả về của các function mountshallowfind và findAll. Bạn có tham khảo dây đủ API và typing tại đây.

find và findAll

Chúng đều nhận Selector như một argument, vừa là một CSS selector, vừa là một Vue Component.

Chúng ta có thể làm một số việc như thế này:

  let cmp = mount(MessageList)
  expect(cmp.find('.message').element).toBeInstanceOf(HTMLElement)

  // Or even call it multiple times
  let el = cmp.find('.message').find('span').element

  // Although for the previous example, we could do it in one
  let el = cmp.find('.message span').element

Xác thực Structure và Style

Hãy thực hiện thêm test trong MessageList.test.js:

it('is a MessageList component', () => {
  expect(cmp.is(MessageList)).toBe(true)

  // Or with CSS selector
  expect(cmp.is('ul')).toBe(true)
})

it('contains a Message component', () => {
  expect(cmp.contains(Message)).toBe(true)

  // Or with CSS selector
  expect(cmp.contains('.message')).toBe(true)
})

Ở đây chúng ta dùng is để xác thực loại component, và dùng contains để check xem có xuất hiện sub-component hay không. Tương tự như find chúng nhận một Selector, bất kể là CSS Selector hay Component.

Chúng ta có các utils để xác nhận (assert) Vue instance:

it('Both MessageList and Message are vue instances', () => {
  expect(cmp.isVueInstance()).toBe(true)
  expect(cmp.find(Message).isVueInstance()).toBe(true)
})

Bây giờ chúng ta sẽ xác nhận Structure một cách chi tiết:

it('Message element exists', () => {
  expect(cmp.find('.message').exists()).toBe(true)
})

it('Message is not empty', () => {
  expect(cmp.find(Message).isEmpty()).toBe(false)
})

it('Message has a class attribute set to "message"', () => {
  // For asserting "class", the `hasClass` method is easier
  expect(cmp.find(Message).hasAttribute('class', 'message')).toBe(true)
})

existsisEmpty và hasAttribute rất thích hợp cho phần này.

Sau đó, chúng ta dùng hasClass và hasStyle để xác nhận Styling. Update component Message.vue với một style, vì hasStyle chỉ nhận style inline:

<li style="margin-top: 10px" class="message">{{message}}</li>

Test như sau:

it('Message component has the .message class', () => {
  expect(cmp.find(Message).hasClass('message')).toBe(true)
})

it('Message component has style padding-top: 10', () => {
  expect(cmp.find(Message).hasStyle('padding-top', '10')).toBe(true)
})

Phương thức get

Như đã nói, chúng ta có các util rất hữu ích để assert các component Vue. Hầu hết dùng form hasX, nhưng có một getX có thể đem đến trải nghiệm test tuyệt vời hơn về tính linh hoạt và dễ debug. Vì thế bạn có thể rewrite như ví dụ dưới đây:

// `has` form
expect(cmp.find(Message).hasAttribute('class', 'message')).toBe(true)

// `get` form
expect(cmp.find(Message).getAttribute('class')).toBe('message')

Kết luận

Có rất nhiều util giúp cho việc test Vue component đơn giản hơn nhiều. Bạn có thể tìm đầy đủ trong các file typing ở đây.

Code ví dụ trên trong repo này.

TopDev via alexjoverm.github.io

Microservices là gì? Speed up Microservices 1: Tác dụng phụ và một số chiến lược cơ bản

Chào mọi người, nếu như các bạn cũng biết thì dự án Teamcrop của mình xây dựng và chạy hoàn toàn trên kiến trúc Microservices và sau hơn 2 năm triển khai thì có một số vấn đề liên quan đến kiến trúc này, thiết nghĩ cần chia sẻ thêm với mọi người để mọi người thấy được rằng Microservices không phải là chìa khóa vạn năng như vẫn hay nghe quảng cáo, dụ dỗ. Mọi kiến trúc đều có đánh đổi và Microservices cũng vậy.

Mình sẽ viết một loạt bài (5, 6 bài gì đó) về việc tăng tốc cho kiến trúc Microservices mà đã rút tỉa được trong quá trình triển khai dự án Teamcrop, bởi tốc độ luôn là yếu tố hàng đầu khi xây dựng các ứng dụng web, và với kiến trúc mới này thì tăng tốc là một kỹ thuật cần xem xét khi triển khai.

Microservices là gì?

Microservices là các dịch vụ nhỏ, tách biệt đại diện cho 1 phần nhỏ tương ứng trong business domain của bạn. Với kiến trúc Monolithic, bạn sẽ có 1 server lớn chịu trách nhiệm giải quyết tất cả các requests. Việc này sẽ gây khó khăn rất nhiều trên phương diện scale.  Microservices có thể cân bằng traffic theo nhu cầu của doanh nghiệp. Nếu đang nhận được 1 lượng lớn thanh toán, bạn có thể scale up thiết bị thanh toán và giữ các dịch vụ khác ở mức sử dụng 1 lượng nhỏ hơn các services.

Microservice VS Monolithic

Mô tả kiến trúc Microservices

Trong kiến trúc Microservices, các service (dự án) tồn tại độc lập nhau về xử lý (process), lưu trữ (database) và request (client/server model). Hình minh họa bên dưới là minh họa 1 thành phần trong kiến trúc microservices (lưu ý là nó không liên quan đến phần bài toán đề cập bên dưới).

Ví dụ bạn xây dựng một hệ thống bán hàng dựa trên Microservices (như Teamcrop chẳng hạn) thì giả sử một đơn hàng được mô tả với các thông tin sau “Hôm nay có nhân viên A tạo một đơn hàng B tại cửa hàng C và xuất từ kho D” thì bạn cần tối thiểu 4 service (project) với database độc lập:

  • Employee service (sử dụng table tc_employee)
  • Store service (sử dụng table tc_store)
  • Inventory service (sử dụng table tc_warehouse)
  • Order service (sử dụng table tc_order). Trong đó table tc_order chỉ chứa khóa ngoại – tức ID của Nhân viên, ID của cửa hàng, ID của nhà kho theo đúng tinh thần thiết kế chuẩn hóa database.

Bởi vì theo kiến trúc Microservices nên hệ thống bạn sẽ chạy 4 dịch vụ khác nhau như trên và chạy ở tối thiểu 4 instance (container, server) khác nhau.

Lợi ích của Microservices

Nếu đọc đến đây thì bạn sẽ thấy được việc tách ra như thế sẽ làm cho mô hình Microservices phát huy thế mạnh như đã quảng cáo là:

  • Source code tinh gọn: bởi vì hệ thống cấu thành từ những dự án nhỏ, mỗi dự án sẽ đơn giản và tập trung vào 1 hoặc 1 vài nghiệp vụ chính nên code base và độ phức tạp cũng không cao. Giúp mang lại tính gọn nhẹ, dễ bảo trì và mở rộng.
  • Bảo mật source code: vì nhân viên nào làm việc ở dự án nào thì chỉ truy cập được source code của dự án đó.
  • Tồn tại độc lập: vì đây là 4 dự án khác nhau và có thể có cách deploy riêng, và một service nào đó chết thì service khác vẫn hoạt động bình thường.
  • Scale độc lập: tùy theo nhu cầu sử dụng của hệ thống mà có thể scale riêng service đó, ví dụ như service đơn hàng sử dụng thường xuyên nên có thể chạy 2, 3 server (container) để tăng performance.

Tác dụng phụ của Microservices

Các điểm bên trên đúng là các ưu điểm của microservices, tuy nhiên, hãy nghĩ đến ngữ cảnh ở trên. Nếu ở website bạn hiện 1 table view với thông tin sau:

Invoice ID Nhân viên Cửa hàng Kho xuất
123456 Võ Duy Tuấn Cropcom Kho HCM

thì bạn sẽ làm như thế nào và tối ưu nhất? Có thể trong đầu các bạn đã nghĩ đến JOIN, nhưng xin thưa, đây không phải là ứng dụng Monolithic, mà đây là microservice và 4 database table này ở 4 database server khác nhau nên không có chuyện JOIN gì cả, và ở table đơn hàng (tc_order) bạn chỉ có EmployeeIDStoreID và WarehouseID.

Chào mừng đến với tác dụng phụ của Microservices.

Một số chiến lược cơ bản

Để giải quyết bài toán hiển thị ở trên, bạn chỉ có thể tiếp cận theo hướng lấy dữ liệu trực tiếp từ service liên quan. Từ EmployeeID, gọi sang service Employee, từ StoreID thì gọi sang service Store…để lấy các thông tin cần hiển thị. Việc này sẽ dẫn đến giao tiếp liên service (inter-service communication).

Trong kiến trúc Microservices, càng hạn chế gọi liên service càng tốt vì các service sinh ra để phục vụ bên ngoài chứ không phải để phục vụ liên service, dẫn đến performance hệ thống sẽ bị giảm, vì nếu thiết kế không tốt, các service bị die hầu như do các service gọi lẫn nhau gây quá tải chứ từ client chưa chắc quá tải :).

Ngoài ra, gọi liên service sẽ có overhead vì vẫn có giao thức kết nối đi kèm (như HTTPS, Protobuf..) nên phải hạn chế. Do đó, cách dễ dàng tiếp cận nhất là sử dụng cache để không phải request nhiều đến các service mà chỉ cần mò vào cache. Có thể sử dụng Redis hoặc memcache cho tính năng này. Nhiệm vụ còn lại của bạn chỉ là làm sao clear cache một cách hiệu quả mà thôi.

Như vậy, với 1 đơn hàng, bạn sẽ cần thêm 3 request đến cache để fetch thêm thông tin (employee, store và warehouse) trước khi trả về client để hiển thị đầy đủ thông tin.

Tham khảo thêm: Việc làm Microservices lương cao tại Topdev

Teamcrop đã làm thế nào?

Ở trên là cách mình đề xuất và mọi người cũng nghĩ ra dễ dàng vì nó khá cơ bản cho các ứng dụng web hiện đại. Tuy nhiên, dự án Teamcrop không theo cách này và theo 1 cách “phức tạp” hơn nhiều và tất nhiên nó sẽ nhanh hơn cách ở trên.

Trong bài tiếp theo, mình sẽ chia sẻ chi tiết cách Teamcrop đã giải quyết bài toán này như thế nào, tận dụng web socket, service worker của trình duyệt để tăng tốc tối đa cho việc hiển thị dạng này.

Hy vọng bạn sẽ thích các thông tin này và sẽ tiếp tục theo dõi loạt bài chia sẻ kỹ thuật tăng tốc cho kiến trúc Microservices.

P.S: Teamcrop.com là hệ thống ERP dành cho chuỗi bản lẻ và luôn tìm kiếm lập trình viên PHP, nếu bạn biết PHP, yêu thích xây dựng các dự án web lớn, phức tạp trên những kiến trúc mới như Microservices, công nghệ mới như Docker thì đừng ngần ngại liên hệ với Tuấn (qua email tuanmaster2012@gmail.com) để tham gia cùng mình xây dựng những sản phẩm thú vị.

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

  Giao tiếp hiệu quả giữa các Microservice
  Hướng dẫn vượt khó Microservices vô cùng giá trị dành cho bạn!
  Xác thực và phân quyền trong Microservices

Nguồn: Bloghoctap

Devops đang rất quý, nhiều công ty hàng đầu cần tuyển Devops lương lên đến $3000

Unit testing các component Vue.js bằng các tool Vue testing và Jest (P2): Test Vue.js Components deep render trong Jest

Hãy cùng xem cách tham khảo cách sử dụng các vue-test-utils để test một cây component đã được render.

Trong Phần 1 chúng ta đã hiểu được cách sử dụng Shadow Rendering để test một component riêng biệt và tránh việc các component bị sub-free từ việc render.

Nhưng trong một số trường hợp, chúng ta lại muốn test một component đại diện cho cả 1 group, hoặc các phần tử như trong Atomic Design.

Bổ sung một Message Component

Đối với hai component Message và MessageList, bên cạnh việc viết các unit test cho chúng, thì chúng ta còn có thể test cả hai cái như một unit nữa.

Đầu tiên chúng ta tạo components/Message.vue:

<template>
    <li class="message">{{message}}</li>
</template>

<script>
  export default {
    props: ['message']
  }
</script>

Và update components/MessageList.vue để sử dụng nó:

<template>
    <ul>
        <Message :message="message" v-for="message in messages"/>
    </ul>
</template>

<script>
import Message from './Message'

export default {
  props: ['messages'],
  components: {
    Message
  }
}
</script>

Test MessageList bằng Message Component

Để test MessageList bằng Deep Rendering, chúng ta chỉ cần sử dụng mount chứ không cầnshallow trong test/MessageList.test.js đã tạo trước:

import { mount } from 'vue-test-utils'
import MessageList from '../src/components/MessageList'

describe('MessageList.test.js', () => {
  let cmp

  beforeEach(() => {
    cmp = mount(MessageList, {
      // Beaware that props is overriden using `propsData`
      propsData: {
        messages: ['Cat']
      }
    })
  })

  it('has received ["Cat"] as the message property', () => {
    expect(cmp.vm.messages).toEqual(['Cat'])
  })

  it('has the expected html structure', () => {
    expect(cmp.element).toMatchSnapshot()
  })
})

Không liên quan nhưng mà, bạn đã bao giờ nghĩ về beforeEach? Đây là một phương pháp “sạch” để tạo một component “sạch” trước mỗi test, một điều rất quan trọng trong unit testing, vì các test không nên phụ thuộc lẫn nhau,

Cả mount và shallow đều sử dụng API hệt như nhau, khác nhau nằm ở chỗ render. Tôi sẽ từ từ show cho bạn API này trong suốt cả series.

Nếu bạn cho chạy npm t bạn sẽ thấy ngay test thất bại vì Snapshot không khớp với MessageList.test.js. Để thực hiện lại, hãy chạy cùng với option -u:

npm t -- -u

Sau đó nếu mở và kiểm tra test/__snapshots__/MessageList.test.js.snap, bạn sẽ thấy có class="message", đồng nghĩa rằng component đã được render.

// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`MessageList.test.js has the expected html structure 1`] = `
<ul>
  <li
    class="message"
  >
    Cat
  </li>
</ul>
`;

Luôn nhớ rằng phải tránh deep render khi có dấu hiệu sẽ xuất hiện các effect phụ, vì một khi các children component xuất hiện thì createdmount sẽ bị kích hoạt, và có thể sẽ kèm theo các HTTP call hoặc các hiệu ứng khác mà chả ai muốn đụng tới. Nếu bạn muốn thử, thêm component Message.vue vào console.log trong hook đã tạo:

export default {
  props: ['message'],
  created() {
    console.log('CREATED!')
  }
}

Sau đó nếu chạy lại các test bằng npm t, bạn sẽ thấy dòng text "CREATED!" trong output cuối cùng. Vì vậy hãy cẩn thận.

Phần 3: Test các Style and cấu trúc của các Vue.js Components trong Jest

TopDev via alexjoverm.github.io

Unit testing các component Vue.js bằng các tool Vue testing và Jest (P1): Viết Vue.js Component Unit Test với Jest

Hãy cùng nhau học cách viết unit test bằng các tool unit test chính chủ từ VueJS và framework Jest.

vue-test-utils, một thư viện VueJS testing chính thức dựa trên avoriaz, vừa mới ra lò. Nó cung cấp tất cả các tool cần thiết giúp viết unit test trong ứng dụng VueJS một cách dễ dàng. Bên cạnh đó, Jest là một testing framework được xây dựng bởi Facebook, giúp testing nhanh vượt trội với nhiều features tuyệt vời như:

  • Hầu như không có config mặc định
  • Interactive Mode rất “cool”
  • Chạy test song song
  • Các spy, stub và mock mới ra mắt
  • Built trên code coverage
  • Snapshot testing
  • Các tiện ích module mocking

Tất nhiên bạn có thể viết test mà không dùng tool này và chỉ cần dùng karma + mocha + chai + sinon + …, nhưng rồi bạn sẽ thấy nó dễ dàng như thế nào.

Set up một project mẫu vue-test 

Hãy bắt đầu bằng một project mới dùng vue-cli :

npm install -g vue-cli
vue init webpack vue-test
cd vue-test

Và chúng ta cần phải install một vài phụ tùng khác:

# Install dependencies
npm i -D jest jest-vue-preprocessor babel-jest

Cần phải cài jest-vue-preprocessor để jest đọc được cái file .vue, và cần babel-jest để hợp nhất với Babel.

Cài vue-test-utils:

npm i -D vue-test-utils

Thêm cấu hình Jest vào package.json:

...
"jest": {
  "moduleNameMapper": {
    "^vue$": "vue/dist/vue.common.js"
  },
  "moduleFileExtensions": [
    "js",
    "vue"
  ],
  "transform": {
    "^.+\\.js$": "<rootDir>/node_modules/babel-jest",
    ".*\\.(vue)$": "<rootDir>/node_modules/jest-vue-preprocessor"
  }
}
...

moduleFileExtensions sẽ chỉ cho Jest extension nào để tìm, và transform sẽ chỉ preprocessor nào để dùng cho các file extension.

Cuối cùng, thêm test script vào package.json:

{
  "scripts": {
    "test": "jest",
    ...
  },
  ...
}

Testing một Component

Ở đây tôi sẽ dùng các Single File Component, và tôi vẫn chưa check xem nó có hoạt động không nếu tách chúng ra các file htmlcss hoặc js riêng, vì thế cứ xem như là bạn cũng làm luộn việc này.

Đầu tiên tạo một MessageList.vue component trong src/components:

<template>
    <ul>
        <li v-for="message in messages">
            {{ message }}
        </li>
    </ul>
</template>

<script>
export default {
  name: 'list',
  props: ['messages']
}
</script>

Và update App.vue để dùng nó như sau:

<template>
  <div id="app">
    <MessageList :messages="messages"/>
  </div>
</template>

<script>
import MessageList from './components/MessageList'

export default {
  name: 'app',
  data: () => ({ messages: ['Hey John', 'Howdy Paco'] }),
  components: {
    MessageList
  }
}
</script>

Chúng ta đã có một vài component để test. Hãy tạo một folder test  trong project root, và một App.test.js:

import Vue from 'vue'
import App from '../src/App'

describe('App.test.js', () => {
  let cmp, vm

  beforeEach(() => {
    cmp = Vue.extend(App) // Create a copy of the original component
    vm = new cmp({
      data: { // Replace data value with this fake data
        messages: ['Cat']
      }
    }).$mount() // Instances and mounts the component
  })

  it('equals messages to ["Cat"]', () => {
    expect(vm.messages).toEqual(['Cat'])
  })
})

Bây giờ nếu ta chạy npm test (hoặc npm t cho nhanh), test sẽ chạy và pass. Vì chúng ta vẫn còn điều chỉnh test, nên chạy nó trên watch mode:

npm t -- --watch

Vấn đề của các nested component (component chồng component)

Bài test này quá đơn giản. Hãy check cả output ban đầu và output dự kiến. Chúng ta có thể sử dụng feature Snapshots của Jest, có thể cho ra snapshot của output và đối chiếu nó với những lần run tới. Add thêm sau it trước trong App.test.js:

it('has the expected html structure', () => {
  expect(vm.$el).toMatchSnapshot()
})

Nó sẽ tạo ra một file test/__snapshots__/App.test.js.snap. Mở và xem kĩ:

// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`App.test.js has the expected html structure 1`] = `
<div
  id="app"
>
  <ul>
    <li>
      Cat
    </li>
  </ul>
</div>
`;

Để ý kĩ bạn sẽ thấy, có một vấn đề rất lớn ở đây: component MessageList  cũng đã bị render. Các unit test phải được test theo mỗi unit riêng lẻ, nghĩa là trong App.test.js chúng ta muốn test component App và không quan tâm đến những thứ khác.

Nó có thể bắt nguồn từ nhiều lý do. Tưởng tượng xem, các component con đó (trong trường hợp này là MessageList) sẽ gây ra nhiều side effect trên created hook, ví dụ như gọi fetch, một Vuex action hoặc các thay đổi state? Chắc chắn chúng ta không hề muốn nó xảy ra.

May thay, đã có Shallow Rendering!

Shallow Rendering là gì?

Shallow Rendering là một kĩ thuật đảm bảo rằng component của bạn được render mà không có component con đi kèm. Nó có lợi ích sau:

  • Chỉ test component bạn muốn test (vậy mới gọi là Unit Test)
  • Tránh các side effect của các component con, như thực hiện các HTTP call, calling store actions,…

Testing Component bằng vue-test-utils

vue-test-utils cung cấp cho chúng ta Shallow Rendering trong số các features. Chúng ta có thể viết lại test trước như sau:

import { shallow } from 'vue-test-utils'
import App from '../src/App'

describe('App.test.js', () => {
  let cmp

  beforeEach(() => {
    cmp = shallow(App, { // Create a shallow instance of the component
      data: {
        messages: ['Cat']
      }
    })
  })

  it('equals messages to ["Cat"]', () => {
    // Within cmp.vm, we can access all Vue instance methods
    expect(cmp.vm.messages).toEqual(['Cat'])
  })

  it('has the expected html structure', () => {
    expect(cmp.element).toMatchSnapshot()
  })
})

Sau đó nếu như bạn vẫn đang chạy Jest trong watching mode, bạn sẽ thấy nó vẫn qua bài test, nhưng Snapshot thì không tương thích. Nhấn u để generate lại lần nữa. Hãy mở và check lại:

// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`App.test.js has the expected html structure 1`] = `
<div
  id="app"
>
  <!--  -->
</div>
`;

Bạn thấy không? Không có component con nào được render và App component được test hoàn toàn tách biệt khỏi bộ component. Ngoài ra, nếu bạn có bất kỳ created hay các hook nào đó trong các component con, chúng cũng không được call nhé.

Nếu bạn tò mò về Shallow render được implement như thế nào, check source code và ta thấy rằng căn bản đó là components key, method render và các lifecycle hook.

Tương tự như vậy, bạn có thể áp dụng MessageList.test.js test như sau:

import { shallow } from 'vue-test-utils'
import MessageList from '../src/components/MessageList'

describe('MessageList.test.js', () => {
  let cmp

  beforeEach(() => {
    cmp = shallow(MessageList, {
      // Beaware that props is overriden using `propsData`
      propsData: {
        messages: ['Cat']
      }
    })
  })

  it('has received ["Cat"] as the message property', () => {
    expect(cmp.vm.messages).toEqual(['Cat'])
  })

  it('has the expected html structure', () => {
    expect(cmp.element).toMatchSnapshot()
  })
})

Xem đầy đủ tại Github.

Phần 2 : Unit testing các component Vue.js bằng các tool Vue testing và Jest (P2): Test Vue.js Components deep render trong Jest

 

TopDev via Alex Jover Blog