Monday 20 August 2018

Copyright from: https://medium.com

Tôi đã bắt đầu học React như thế nào?

Chia sẻ rất hay của anh Pete Houston, mình xin phép dịch lại cho các bạn tham khảo!
Hiện nay, ReactJS đang nhận được rất nhiều sự chú ý và nó đang trở nên rất phổ biến, điều này khiến các lập trình viên muốn tìm hiểu và thử làm việc với React. Tuy nhiên, tôi (Pete Houston) đã gặp rất nhiều câu hỏi kiểu như:
  • Làm thế nào để bắt đầu với React?
  • Tôi đã học theo chỉ dẫn trên trang chủ của React nhưng vẫn không biết mình nên làm gì với React.
  • Tìm kiếm trên Google thì gặp hàng tá các hướng dẫn, ví dụ về React, nhưng nó quá dài và nhiều khái niệm phức tạp như Webpack, Babel, ES6/7, GraphQL, Relay, Flux, Redux,… Làm sao để một người có thể học React một cách đơn giản, dễ hiểu?
  • …etc
Theo tôi, việc học React yêu cầu phải có một chút kiến thức về công nghệ và kỹ năng lập trình. Bạn không thể cứ nhảy bổ vào học vì thấy người khác học React rất nhanh và cho rằng mình cũng vậy. Không có khái niệm ‘nhanh’ trong việc học. (Tác giả cũng không chắc chắn về điều này, theo mình thì vẫn có nhiều người có khả năng tư duy, tiếp thu nhanh bẩm sinh, do đó khái niệm ‘nhanh’ có thể vẫn tồn tại).
Tôi xin phép được chia sẻ câu chuyện về việc học React của mình.

Hai năm trước, khi còn làm việc với Angular, tôi đã gặp một vấn đề trong việc duy trì chia sẻ các thành phần giữa web và di động. Nó dạng như:
  • Input càng lag khi có nhiều kí tự được nhập. ($watch của Angular 1.x). Nó càng lag hơn đối với thiết bị di động.
  • Các controller lộn xộn vì tôi đã phải định nghĩa controller cho một template directive, và khi sử dụng chúng trong HTML, tôi cần nhiều ứng dụng controller hơn. Truyền dữ liệu và định nghĩa scope thực sự phức tạp.
  • Luồng dữ liệu hai chiều đã tạo ra rất nhiều lỗi ‘vi diệu’. Và console log của Angular thực sự là “truly descriptive”. (Mình không biết dịch cụm từ này thế nào cho sát nghĩa nên để nguyên gốc).
Khi tìm kiếm giải pháp để nâng cao Angular codebase từng chút một, tôi đã tìm thấy React (như kiểu ánh sáng nơi cuối con đường =))). Sau vài giờ ‘nghịch’ nó trên trình duyệt, tôi đã tìm được giải pháp cho mình. Do đó tôi quyết định chuyển hết code từ Angular sang React sau 3 ngày suy nghĩ.
Nhưng đó không phải công việc dễ dàng, bởi vì tôi không có nhiều kiến thức về React. Học theo hướng dẫn của React không được coi là biết về nó. Sau đó tôi đi sâu hơn vào React và hệ thống sinh thái của nó. Thực chất tôi gọi là hệ thống sinh thái có nghĩa là bất cứ thứ gì mà liên quan đến React được sử dụng như những yêu cầu cho một khối xây dựng ứng dụng React tốt.
Tôi đã vẽ ra một lộ trình cho việc học sau khi tìm ra thứ mà tôi thực sự cần để thiết kế lại ứng dụng của mình. Và lộ trình đó đây:

Học ECMAScript ES6

Lúc đó, tôi chỉ dùng ES5 nhưng khi thấy ES6 có tương lai hơn và đội ngũ React cũng sử dụng nó, nên học ES6 (thậm chí là ES7) là một lựa chọn đúng đắn. Thứ này rất dễ học với tôi bởi vì tôi đã quen với ngôn ngữ (ý nói Javascript) và syntax mới không khó lắm. Nếu bạn đã quen với Javascript thì bạn sẽ không hề gặp vấn đề nào khi học ES6. Nhưng nếu không, thì hãy bỏ thêm thời gian.
Một số trang đã được tạo để giúp việc học ES6:
Một số tính năng quan trọng của ES6 được sử dụng thường xuyên trong React hiện nay, và tôi rất muốn đề nghị bạn nên học nó trước khi đâm sâu vào React:
  • sses.
  • Arrow function.
  • Constant
  • Scope (variables, functions).
  • map() function.
  • Destructuring assignment.
  • Template string. (tùy chọn, nhưng nó rất hữu ích cho việc định dạng chuỗi)

Học Webpack

React sử dụng Webpack như một công cụ mặc định. Do đó, học cách sử dụng Webpack cho việc triển khai ứng dụng là rất cần thiết. Nhưng thời điểm này, Webpack không được phổ biến như Grunt hay Gulp, có rất khó để tìm một hướng dẫn nào tốt, rõ ràng để giải thích các chức năng của Webpack.
Tôi đã rất khó khăn khi học Webpack, tìm lấy các hướng dẫn, tài liệu, ghi nhớ chúng. Tạo rất nhiều Webpack nhỏ đơn giản và thay đổi vài cấu hình khác nhau để quan sát sự khác biệt. Tôi tin vào phương pháp ‘thử nghiệm và lỗi’ trong học tập. Tôi đã mất cả một tháng để học, nhưng nó rất có giá trị.
Tuy nhiên, ở thời điểm viết bài này (thời điểm tác giả viết chứ không phải thời điểm mình dịch), Webpack đã được phổ biến và có rất nhiều ví dụ và hướng dẫn chất lượng cho Webpack. Nếu bạn chưa biết gì về Webpack và muốn học nó, tôi thực sự đề nghị bạn nên tham khảo các trang này:
Bạn có thể tìm hiểu sâu hơn về loaders và plugins sau nếu thấy cần thiết.

Học React

Sau đó, tôi đã ngay lập tức bắt đầu với React. Nó có vẻ dễ bởi vì tôi đã quen với syntax của ES6 và Webpack.
Một số khái niệm nên học cẩn thận nếu bạn hoàn toàn chưa biết gì về React:
Đừng bỏ qua việc học chúng nếu bạn không muốn hối hận sau này.

Học ReactRouter

Điều hướng trong front-end là rất quan trọng, do đó ta cần đến ReactRouter. Tôi mất kha khá thời gian cho phần học này . Tôi vẫn tạo và xóa các dự án để học ReactRouter. Bởi vì tâm trí tôi đã bị gắn liền với ngRoute của Angular, do vậy thật khó để nghĩ về việc điều hướng trong React thông qua các component.
Ở điểm điểm viết bài này, có rất nhiều hướng dẫn về ReactRouter, vậy nên tôi không cung cấp nhiều link, chỉ một link mà tôi nghĩ rằng nó đủ tốt cho người mới:

Học Flux

Flux là một thiết kế kiến trúc cho front-end bởi đội ngũ Facebook React. Nó tốt hơn bất cứ MV* nào như Angular (Angular theo mô hình MVC). Tôi đã bắt đầu việc học Flux của mình với Reflux. Đã có một khoảng thời gian khó khăn trong việc học. Khái niệm thì tương đối ổn, nhưng sau đó là những ứng dụng luồng dữ liệu phức tạp, tôi đã mất dấu trong việc quản lý dữ liệu. Debug cũng khó bởi vì nó là thứ gì đó dựa trên sự kiện. Tuy nhiên, nhờ học việc sử dụng Redux rất khó nhọc mà tôi đã nắm được cái ý niệm của kiến trúc Flux. Sau đó tôi cần tìm một vài thư viện mà có thể giúp mình quản lý dữ liệu tốt hơn. May mắn thay, Redux 200 xuất hiện! (Ánh sáng cuối con đường part 2).

Học Redux

Tôi đã đọc các tài liệu và học Redux hầu như không tốn thời gian. Đơn giản và nhanh như tác giả của Redux đề cập:
Đừng để bị lừa bởi tất cả những cuộc nói chuyện về reducers, middleware, store enhancers — Redux đơn giản đến kinh ngạc. Nếu bạn đã đừng xây dựng một ứng dụng Flux, bạn sẽ cảm thấy như ở nhà, nếu bạn chưa biết gì về Flux, nó cũng đơn giản thôi! —Tài liệu ReduxJS.
Chỉ đơn giản viết lại ứng dụng TodoList vài lần, bạn sẽ học nó thật là nhanh. Tôi hứa với bạn điều này!
Có 2 thứ cần ghi nhớ khi sử dựng Redux:
Dữ liệu nên luôn luôn bất biến. Sẽ rất là tốt và cũng là một bài tập tốt để làm cho dữ liệu của bạn bất biến nếu bạn không muốn tốn thời gian tìm những nhà ảo thuật gia đang nấp ở đâu đó trong ứng dụng của bạn.
Cẩn thận xử lý hành động không đồng bộ. Bạn không muốn mất dữ liệu ở đâu đó trong hoạt động bất đồng bộ chứ?

Học bằng cách luện tập viết nhiều ứng dụng từ nhỏ đến lớn.

Bạn sẽ không thực sự nhận được thứ gì đó nếu không sử dụng chúng. Đây là một phần rất quan trọng của việc thay đổi quan niệm để làm việc tốt với React. Cố nghĩ ra nhiều ý tưởng nhỏ và áp dụng nó vào React.

Học, học nữa, học mãi.

Vào lúc này, bạn có thể tìm bất cứ thứ gì trong hệ thống sinh thái của React mà phù hợp với kiến trúc của bạn, học và sử dụng một cách đúng đắn. Một vài thứ bạn có thể xem qua:

Tôi đã mất một quãng thời gian khó khăn, khoảng 3 tháng rưỡi đi sâu vào tìm hiểu React và những hàng xóm của nó. Nhưng nó đã tiết kiệm giúp tôi rất nhiều, viết lại cái ứng dụng lớn và cũ sử dụng Angular mà tôi đã mất 3 tháng phát triển nay chỉ có 5 tuần khi sử dụng React. Mọi thứ đã dễ dàng hơn, và React thật tuyệt vời nếu bạn học nó một cách đúng đắn. Với ứng dụng di động, tôi không sử dụng React Native bởi vì nó không có ở đây. Tôi sử dụng Apache Cordova với React để xây dựng ứng dụng di động hồi năm 2014. Bằng cách nào đó, nó hoạt động, nó đã hoạt động!
Nếu bạn thực sự muốn học React, hãy nhớ: “Đừng vội, giữ bình tĩnh và học React từng bước một”.
Mình cũng muốn cùng tác giả chúc các bạn đạt may mắn và thành công trên con đường đã chọn!
Cám ơn anh Pete Houston đã có một chia sẻ rất hữu ích cho mọi người!

Thursday 13 July 2017

CRM - Phân tích luận điểm Customer Service trên CRM

Copyright from: forums.bsdinsight.com

Một chủ đề rất nóng hiện nay, cửa hàng lúc thì người tính tiền không kịp, cửa hàng lúc thì nhân viên ngồi tám chuyện Ronaldo...

Một bài toán nan giải cho các nhà quản lý là làm sao tiềm được khách hàng mới, bên cạnh việc duy trì khách hàng trung thành với doanh nghiệp bài toán còn nan giải hơn, sách có câu tề gia chưa được thì làm sao trị quốc.

Dịch vụ chăm sóc khách hàng, hoạt động cần thiết cho doanh nghiệp vào thời đại cạnh tranh. Đơn giản là việc nhắc khách hàng là "Chúc mừng sinh nhật" vào đúng ngày sinh nhật cũng là một câu chuyện làm cho khách hàng cảm thấy được quan tâm hơn bao giờ hết, cao cấp hơn tí là "chúc mừng sinh nhật" người thân của khách hàng luôn càng tuyệt vời hơn. Tỷ như là mua một chiếc smartphone ở Quận 1, mà có thể bảo hành ở Q12 mà không cần bắt cứ thủ tục nào hết, chỉ cần chìa cái điện thoại ra ngồi cafe và đợi lấy dế khi hoàn thành.... thử hỏi khách hàng có phê không chứ.

Nói đến dịch vụ, chưa nghĩ đến doanh thu nó mang lại thì người ta sẽ nghĩ ngay đến chi phí mà dịch vụ khách hàng phát sinh, và các nhà quản lý làm sao để cắt giảm chi phí này đến mức thấp nhất mà vẫn mang lại hiệu quả. Việc đầu tư cho một giải pháp toàn diện về CRM hoặc một giải pháp chuyên phục vụ công việc dịch vụ khách hàng, tự động hóa các dịch vụ này để giảm công việc cho con người là thuốc giải cho vấn đề này cho đến thời điểm này mà các nhà quản trị vấn dùng.

Các công cụ ưa dùng nhất mà chắc ai cũng biết: Web hỗ trợ, Email hỗ trợ, Call Center hỗ trợ, Cung cấp các thư viên Knowledge Base giúp khách hàng tra cứu, tìm kiếm cách khắc phục, hoặc ngay cả diễn đàn (web 2.0) vẫn được tin dùng để cung cấp nhiều hơn việc khách hàng tương tác với doanh nghiệp, hoặc là kênh cung cấp các vấn đề phát sinh khi sử dụng sản phẩm.

Môt số công cụ gần đây phát triển mạnh đó là các Call Center, và SMS - bạn gặp phải vấn đề, đơn giản nhất điện thoại gọi vào 1 số nào đó của cty cấp, thế là luôn luôn có người hỗ trợ bạn, hoặc bạn có thể nhắn tin vào tổng đài mà doanh nghiệp cung cấp.

Và giờ đây, với mạng xã hội phát triển một cách mạnh mẽ, việc tận dụng Social Network được nghĩ tới, và bắt đầu vận hành vào một số công ty, mang lại lợi tức đáng kể cho doanh nghiệp, và cho chính khách hàng sử dụng dịch vụ của công ty.

Quản lý nhân công

Khi nói đến dịch vụ thì phải nói đến nhân công, giờ công, vận hành dịch vụ. SMS, CallCenter, email,... là các hoạt động tầng nổi hoạt động dịch vụ chăm sóc khách hàng.

Khi có một dịch vụ phát sinh thì cần biết được nhân công nào phù hợp cho dịch vụ cần thực hiện (về kỹ năng, về thời gian làm việc...) từ đó mới chuyển cho đúng nhân viên làm việc. Qua đó ghi nhận chính xác giờ công, quá trình làm việc của nhân công.

Có thể không quá đẳng cấp và chuyên nghiệp đến mức là quản lý chi tiết bằng cấp, kỹ năng, level kỹ năng, giờ công lao động,... như những giải pháp quản lý dịch vụ. CRM vẫn phải đáp ứng được các yêu cầu cơ bản về dịch vụ.

Kế hoạch dịch vụ

CRM giúp cho các nhà quản lý dịch vụ lập ra được một kế hoạch từ đầu quá trình chăm sóc khách hàng, dịch vụ các sản phẩm mà doanh nghiệp cung cấp cho khách hàng.

Kế hoạch định kỳ cho việc thay nhớt một chiếc xe máy, kế hoạch về việc bảo trì lốp xe, kế hoạch về thời gian đáo hạn của khách hàng, kế hoạch cần phải tiêm ngừa bệnh dại cho công dân trong thành phố.... thì tất cả cần phải chính xác và ẹệ thống làm việc tự động (làm sao mà nhớ nổi đây, nhiều quá mà).

Giả sử mình quay về với các yêu với phần mềm của các hoạt động dịch vụ khách hàng thì có thể bao gồm các yêu cầu nào
  1. Phải tổ chức và quản lý chắc chẽ các yêu cầu dịch vụ của khách hàng (case), chí it là ngày nhận, ai nhận, từ khách hàng nào, vấn đề của khách hàng là gì, liên lạc với ai ở khách hàng, thời gian nhận được, nhận được từ phương tiện nào (điện thoại di động, call center, sms,...), và tùy thuộc vào các dịch vụ của doanh nghiệp mà chắc chắn sẽ có thêm các thông tin nữa như tình trạng hiện tại......
  2. Phần mềm phải cung cấp các công cụ để làm sao khi gặp phải vấn đề, thì khách hàng sẽ liên lạc với bộ phận dịch vụ của bạn dễ dàng nhất, nhanh nhất với mọi phương tiện có thể của họ.
  3. Việc Corporate với nhau làm việc trên cùng một yêu cầu dịch vụ của khách hàng là chắn chắn phải cần với phần mềm CRM như là chia sẻ cho mọi người truy cập, thông báo cho nhân viên kinh doanh biết, tạo các activities liên quan tới vấn đề này, CRM còn phải tìm ra được các Resource (nhân sự) mà họ đã có kinh nghiệm về việc này.... tức là làm thế nào để dễ dàng thông báo, làm việc với nhau trong nội bộ doanh nghiệp của bạn.
  4. Tổ chức quản lý được các Resource trong đó thường bao gồm các công cụ, dụng cụ, con người của doanh nghiệp bạn liên quan tới vấn đề mà khách hàng yêu cầu dịch vụ.
  5. Lịch làm việc cho các Resouce liên quan là một vấn đề rất quan trọng, giúp cho bạn lên được kế hoạch hỗ trợ khách hàng, mà điều này rất quan trọng với dịch vụ khách hàng nhằm đảm bảo uy tín của doanh nghiệp bạn với khách hàng.
  6. Tổ chức và quản lý thật chặc chẽ các hợp đồng dịch vụ với khách hàng bạn, các dịch vụ mà bạn cung cấp cho khách hàng, và các thông báo về không đáp ứng được các yêu cầu dịch vụ này.
  7. Khả năng phối kết hợp với bộ phận kinh doanh và marketing để cung cấp cho các nhân viên này các thông tin và khả năng cung cấp thêm các sản phẩm cho khách hàng của mình.
  8. Công cụ để bạn tăng cường khả năng chăm sóc khách hàng (Customer Care) của bạn.
  9. Truy cập vào hệ thống mọi lúc mọi nơi, với các thiết bị di động.
  10. Và cuối cùng là phải nghi nhận các history của các hoạt động dịch vụ khách hàng này.
Và nếu chúng ta xoay quanh các vấn đề về nhu cầu với một phần mềm, khả năng chúng ta có rất nhiều thông tin về phần mềm và chắc chắn nó sẽ là các thông tin hữu ích cho bạn.

CRM - Phân tích luận điểm Marketing trên CRM

copyright from: forums.bsdinsight.com

Marketing - tiếp thị là hoạt động rất quan trọng trong doanh nghiệp, hoạt động cần thiết để mang sản phẩm của doanh nghiệp đến với khách hàng, qua đó mang lại lợi ích cao nhất có thể.

Việc tiếp thị có rất nhiều cách, từ ngàn xưa việc kinh doanh mua bán đã bắt đầu tiếp thị, khi có hàng hóa nhà nông đã biết ra chợ và bán cho khách hàng, đó là một hoạt động điển hình của tiếp thị. Tuy nhiên, hoạt động tiếp thị vào giai đoạn phát triển bùng nổ của công nghệ, việc mang ra chợ và tiếp thị khả năng không còn phát huy tác dụng nữa.

Sự cạnh tranh ngày càng "nóng" giữa đối thủ cạnh tranh, và trên hết là yêu cầu ngày càng cao của người tiêu dùng, và đó là sự ra đời của giải pháp CRM quản trị khách hàng.

CRM sẽ là nơi tập trung mọi thông tin về khách hàng (kể cả khách hàng tiềm năng, và khách hàng đã mua hàng, sử dụng dịch vụ, cùng với khách hàng đã ra đi từ công ty của bạn) - và đây là nơi mà số liệu cung cấp về khách hàng tiềm năng ở một thị trường nào đó mà bạn cần một cách định lượng

Các hoạt động thường nhật mà dễ thấy nhất mà marketing có như:
  • Thư chào sản phẩm dịch vụ cho khách hàng - thông tin khách hàng từ CRM
  • Công ty bạn làm 1 event để giới thiệu sản phẩm, dịch vụ - thông tin khách hàng sẽ được lấy từ CRM.
  • Một chiến dịch gọi điện quảng cáo sản phẩm, dịch vụ - thông tin từ CRM.
  • Một chiến dịch gởi email/SMS để giới thiệu sản phẩm, dịch vụ, hoặc ngay cả một đợt khuyến mãi bán hàng của bạn - thông tin lấy từ CRM.
  • Bạn làm thế nào để lắng nghe được các đối tượng khách hàng của bạn đang nói gì về sản phẩm, dịch vụ của công ty bạn, và ông bạn "tình địch" của bạn, từ Social Network và được đưa và CRM của bạn.
  • Bạn gọi điện cho khách hàng, thông tin được lưu lại trong CRM cho bạn, và 1, 2, 3 tháng sau, bạn vẫn được CRM gợi nhớ cho bạn về cuộc điện đàm này, khách hàng có ủng hộ sản phẩm của bạn hay không?
Tất cả những hoạt động trên nhằm cung cấp cho bạn biết nhiều hơn về khách hàng của bạn, và đây là điều kiện cần để bạn mang sản phẩm của bạn tới với khách hàng của mình, cung cấp cho họ đúng sản phẩm/dịch vụ, đúng khách hàng, đúng thời điểm, và đúng thị trường và điều này sẽ mang lại sự thành công cho doanh nghiệp của bạn.

Định lượng giá trị mang lại của Marketing.

Làm thế nào định lượng được con số mà một chiến dịch marketing mang lại cho bạn? không đơn giản nếu không có một sợi dây kết nối giữa bộ phận marketing của bạn với bộ phận sale, hoặc bộ phận customer care - CRM là công cụ để làm việc này cho bạn, một công cụ hàng đầu cho: Marketing, Sale và Customer Care.

Giá trị của việc đánh giá này mang lại rất nhiều lợi tức cho công ty của bạn với việc xác định đâu là chương trình marketing tốt nhất cho sản phẩm A., B, C nào đó vào phân khúc khách hàng M, N, P nào đó và vào thị trường nào đó. Giúp cho bạn nhanh chóng có các quyết định sớm hơn về các thị trường mới cho sản phẩm của bạn. Nhanh chân hơn, bạn đã có một lợi thế rất lớn so với anh bạn "tình địch" rồi - cùng với đó, chắc chắn CRM sẽ mang lại dịch vụ tốt hơn cho khách hàng, bạn đã chiếm được lòng tin của cô nàng đỏng đảnh.

Việc định lượng các giá trị mà marketing mang lại sẽ giúp rất nhiều cho việc phát triển kinh doanh của bạn, đưa thương hiệu sản phẩm và dịch vụ của bạn đến gần hơn với khách hàng của bạn, tiếp cận được với nhiều hơn đối tượng khách hàng của bạn, và bạn sẽ nhận được nhiều hơn thông tin phản hồi từ khách hàng của bạn, và sự "tâm tình" này sẽ là định hướng, chiến lược cho doanh nghiệp của bạn.

Kết nối Marketing và Sale

CRM là công cụ để bạn nối sợi dây liên lạc Marketing + Sale dựa trên nền tảng là khách hàng, sản phẩm, và thị trường và đây chính là cái lợi lớn cho các nhà quản trị với mong muốn mở rộng thị phần, tìm kiếm khách hàng mới, tìm kiếm thị trường mới và cuối cùng là oánh giá được các công việc mình làm hiệu quả tới đâu, mang lại doanh thu là bao nhiêu, mang lai bao nhiêu khách hàng cho từng domain mà họ cần phân tích.

Bạn muốn đưa doanh nghiệp bạn đi lên, vươn ra xa hơn nữa, phát triển hơn nữa thì cần rất nhiều yêu cầu về tiềm lực tài chính như bản thân nội tại của bạn phải hiểu rất rõ về sản phẩm của mình, khách hàng của mình, khách hàng tiềm năng của mình,... và mình cần tìm kiếm khách hàng ở đâu,... ..chính CRM chứ không công cụ nào khác cung cấp cho bạn điều này

CRM - Phân tích luận điểm Sales trên CRM

copyright from: CRM - Sales

Sale, no sale no business, và đúng là sale rất quan trọng. Để đánh giá được CRM hỗ trợ cho sale thế nào thì có thể anh/em ta sẽ tập trung vào một số vấn đề

  1. Qui trình kinh doanh bán hàng của doanh nghiệp
  2. 3 đối tượng liên quan trực tiếp tới sale là: Khách hàng, Nhân viên kinh doanh và Sản phẩm.
  3. 2 Vấn đề liên quan tới sale kế tiếp có thể nói là: Khách hàng và Thị trường.
  4. Các vấn đề về quản lý sale sẽ là: Tổ chức đội ngũ sale (thường được gọi là sale struture) và kế hoach kinh doanh.
  5. Một vấn đề liên quan tới sale nữa là kênh bán hàng: trực tiếp, gián tiếp, đại lý cấp 1, 2, 3....titvi,..., cùng với các vấn đề liên quan tới đại lý như giảm giá, thưởng, hạn mức (quota), cùng với các chương trình đánh giá đại lý
  6. Các vấn đề của sale lại tiếp tục liên quan tới sale là tài chính bao gồm: doanh thu và lợi nhuận.
  7. Kế hoạch kinh doanh cũng là một vấn đề cần được xem xét rất kỹ trong việc quản lý sale.
Việc có hay không CRM thì họ vẫn mua bán bình thường rồi, nhưng ông anh đối thủ (hoặc là "gần" đối thủ ông đi nhanh hơn, và đó là điều kiện để doanh nghiệp bạn đi vào ngõ cụt) - cũng như, đâu cần Internet tôi vẫn bán hàng được mà, nhưng bạn dùng Fax, trong khi anh bạn kia dùng email, dùng điện thoại Internet... và họ sẽ thân thiện với khách hàng bạn hơn, họ sẽ dần xa bạn hơn, và cái khoản cách đó sẽ được đóng lại bằng một buổi sáng đẹp trời bạn nhận được cái thư thanks you, chúng tôi sẽ chọn công ty XYZ mà không chọn bạn nữa. Doanh nghiệp bạn mất 1 khách hàng, vẫn sống thôi, nhưng bạn đã bị thụt lùi so với đối thủ của bạn.

Bạn hãy xem và hãy nghĩ cái cách mà CRM mang lại, đó là CRM là công cụ, mang lại sự gần giũ giữa bạn và khách hàng của bạn hơn và đó là cái cách mà CRM giúp bạn trong kinh doanh, và không lẽ ngẫu nhiên mà Bill Gate có nói: Nếu bạn không biết về Internet, thì bạn đừng kinh doanh - và tôi cũng hiểu rằng, Internet cũng chỉ là một công cụ trong các công cụ mà người Sale sử dụng để tiếp cận với khách hàng của mình, và ngày nay là CRM và trong tương lai sẽ Social Listening.

Wednesday 7 September 2016

DEPENDENCY INJECTION VÀ INVERSION OF CONTROL – PHẦN 3: DI CONTAINER. ÁP DỤNG DI VÀO ASP.NET MVC

Copyright from: toidicodedao.com

Series bài viết Dependency Injection và Inversion of Control gồm 3 phần:
  1. Định nghĩa
  2. Áp dụng DI vào code
  3. Viết DI Container. Áp dụng DI vào ASP.NET MVC
Sau 2 phần đầu, chắc các bạn đã có cái nhìn tổng quan về DI và cách áp dụng chúng vào code. Đa phần chúng ta không tự viết sử dụng các DI Container nổi tiếng như: Unity, NInject, StructureMap.
Để hiểu nguyên lý hoạt động của chúng, mình sẽ cùng các bạn cách viết một DI Container đơn giản (chúng cũng không quá “ghê gớm” hay phức tạp như bạn nghĩ đâu). Sau đó mình sẽ hướng dẫn cách sử dụng cái DI Container có sẵn, cũng như áp dụng IoC và project MVC.

1. Tự viết 1 DI Container đơn giản

Các bạn có thể dùng git để clone project về máy và bắt đầu làm theo mình: https://github.com/ToiDiCodeDaoSampleCode/SimpleIoC. Các class và interface vẫn như trong phần 2, có điều mình đã bổ sung thêm 1 số class mock – module giả. Trong thực tế, ta sử dụng các class mock này để viết Unit Test.
solution
DI Container thường có 1 function dùng để setup module và interface, một function khác để lấy module dựa theo interface. Ở đây mình gọi 2 function đó là SetModule và GetModule.
1
2
3
4
5
6
7
8
9
10
11
12
public class DIContainer
{
    public static void SetModule()
    {
        SetModule(typeof(TInterface), typeof(TModule));
    }
 
    public static T GetModule()
    {
        return (T)GetModule(typeof(T));
    }
}
Code của hàm Main cũng rất đơn giản. Ta chỉ cài đặt các interface và module tương ứng thông qua function SetModule. Với class Cart, ta chỉ cần gọi hàm GetModule. DIContainer sẽ tự inject IDatabase, ILogger vào theo code ta đã viết.
1
2
3
4
5
6
7
8
9
//Với mỗi Interface, ta define một Module tương ứng
DIContainer.SetModule();
DIContainer.SetModule();
DIContainer.SetModule();
 
DIContainer.SetModule();
 
//DI Container sẽ tự inject Database, Logger vào Cart
var myCart = DIContainer.GetModule();
Class DI Container sẽ có các đặc tính sau:
  • Lưu trữ các Interface, Module tương ứng vào một Dictionary có Key là Interface, Value là Module. Để lấy một Module từ Container, ta cần đưa vào Interface của Module đó.
  • Khi cài đặt một module, container sẽ tìm Constructor đầu tiên của module đó.
  • Nếu contructor không có tham số (Module không có dependency), container sẽ gọi constructor này để khởi tạo module.
  • Nếu constructor này có tham số (Có dependency), container sẽ khởi tạo các tham số này, gán chúng vào constructor của module. Đây là quá trình injection.
Việc implement cũng không phức tạp lắm, bạn đọc code và comment sẽ hiểu thôi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class DIContainer
{
    //Dictionary để chứa các interface và module tương ứng
    private static readonly Dictionaryobject>
               ResgisteredModules = new Dictionaryobject>();
 
    //Hai hàm cơ bản, ở đây mình chuyển thành
    //dạng Type trong C# để dễ viết code
    public static void SetModule()
    {
        SetModule(typeof(TInterface), typeof(TModule));
    }
 
    public static T GetModule()
    {
        return (T)GetModule(typeof(T));
    }
 
 
    private static void SetModule(Type interfaceType, Type moduleType)
    {
        //Kiểm tra module đã implement interface chưa
        if (!interfaceType.IsAssignableFrom(moduleType))
        {
            throw new Exception("Wrong Module type");
        }
 
        //Tìm constructor đầu tiên
        var firstConstructor = moduleType.GetConstructors()[0];
        object module = null;
        //Nếu như không có tham số
        if (!firstConstructor.GetParameters().Any())
        {
            //Khởi tạo module
            module = firstConstructor.Invoke(null); // new Database(), new Logger()
        }
        else
        {
            //Lấy các tham số của constructor
            var constructorParameters = firstConstructor.GetParameters(); //IDatebase, ILogger
 
            var moduleDependecies = new List<object>();
            foreach (var parameter in constructorParameters)
            {
                var dependency = GetModule(parameter.ParameterType); //Lấy module tương ứng từ DIContainer
                moduleDependecies.Add(dependency);
            }
 
            //Inject các dependency vào constructor của module
            module = firstConstructor.Invoke(moduleDependecies.ToArray());
        }
        //Lưu trữ interface và module tương ứng
        ResgisteredModules.Add(interfaceType, module);
    }
 
    private static object GetModule(Type interfaceType)
    {
        if (ResgisteredModules.ContainsKey(interfaceType))
        {
            return ResgisteredModules[interfaceType];
        }
        throw new Exception("Module not register");
    }
}
Kết quả:
rs

2. Sử dụng DI Container từ các framework có sẵn

Tất nhiên, nếu người khác đã viết sẵn, kiểm thử và fix lỗi, chúng ta có thể tái sử dụng mà không cần phải viết lại từ đầu cho mệt. Mình sẽ hướng dẫn các bạn sử dụng DI Container của Ninject và Unity.
Dùng Nuget (hoặc Package Manager Console) để cài đặt Ninject vàUnity. Nhấp chuột phải vào project SimpleIoC, chọn Manage Nuget packages.
12
Vì bạn đã chia code ra thành các module và interface rồi, ta chỉ cần thay code của DIContainer thành code Unity và Ninject là được.
Ninject
1
2
3
4
5
6
7
8
var kernel = new StandardKernel();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
 
//DI Container sẽ tự inject Database, Logger vào Cart
var myCart = kernel.Get();
Unity
1
2
3
4
5
6
7
8
var container = new UnityContainer();
container.RegisterType();
container.RegisterType();
container.RegisterType();
container.RegisterType();
 
//DI Container sẽ tự inject Database, Logger vào Cart
var myCart = container.Resolve();

3. Áp dụng IoC vào project MVC

Đa phần các framework như Spring.NET, ASP.NET MVC, Spring, Struts đều có sẵn DI Container, hoặc cho phép tích hợp DI Container bên ngoài. Vì đây là blog C# nên mình sẽ hướng dẫn cách tích hợp IoC vào project MVC. Mọi công đoạn chỉ mất từ 2-5 phút. (WebForm không áp dụng IoC được vì Page Cycle khá phức tạp, không cho phép ta can thiệp vào quá trình khởi tạo page).
Bước 1. Tạo 1 project MVC trong cùng Solution. Add References tới project SimpleIoC để tái sử dụng class cho tiện.
4
Bước 2. Thêm parameter vào constructor của controller, module Cartsẽ được inject vào. Nếu chạy thử bạn sẽ bị lỗi “No paramterless constructor …”
56
Bước 3. Sử dụng Nuget, tìm và cài Unity Bootstraper for ASP.NET MVC(Các DI Container khác như NinjectStructureMap đều có Bootstraper cho MVC cả, đừng lo). Ta sẽ thấy có file mới tên là UnityConfig được tạo ra.
Ta vào file này và thực hiện việc setup các interface và module. Tùy theo phiên bản MVC mà nội dung các file tạo ra có khác nhau chút đỉnh. Tuy nhiên cú pháp cài đặt vẫn như cũ.
8
Bước 4. Chạy thử và … xong. Chúc mừng bạn đã hoàn thành bài viết 3 phần về IoC đầy khó khăn và gian khổ.
10
Nhờ IoC và mock, ta có thể Unit Test từng module riêng lẻ. Các bạn có thể xem thêm ở đây: https://duyphuong13.wordpress.com/2013/12/15/mot-so-ky-thuat-trong-unit-test/, vì có bạn đã viết khá chi tiết rồi nên mình không viết lại nữa. Nếu có góp ý hay gạch đá gì các bạn cứ ném thoải mái trong phần comment nhé.