Phần 1: MINIFACE- Mạng xã hội rút gọn

CASE STUDY 1: MINIFACE-MẠNG XÃ HỘI RÚT GỌN

Kỳ 1 : CHUẨN BỊ ĐỒ CHƠI

Tác giả: TĂNG HẢI NGỌC SƠN – HUNTERBMT

Chào tất cả các bạn, sau một thời gian dài không xuất hiện trên kieutrongkhanh . Hôm nay mình mạn phép quay trở lại, với một chuyên mục hoàn toàn mới: Case study. Sau một thời gian dài hoạt động, có lẽ kieutrongkhanh đã cung cấp cho các bạn khá nhiều kiến thức nền tảng, từ J2EE, EJB tới Spring , Hibernate và cả RESTful  webservice, …. Theo ý kiến chủ quan của mình, từng đấy kiến thức là đã khá đủ để làm nền tảng, cho việc tự nghiên cứu sau này. Cái các bạn thiếu, có lẽ là cách ghép nối toàn bộ những thứ kiến thức, chiêu thức trên lại với nhau một cách hiệu quả để đi đến mục đích cuối cùng – tạo ra một ứng dụng đúng nghĩa. Vì vậy chuyên mục case study này ra mắt, nhằm mục đích đưa ra các case study, để chúng ta cùng nhau thực hiện,cùng nhau trao đổi và cùng nhau đạt được mục đích. Mình cũng rất mong nhận được các case study đóng góp từ các bạn, có thể là ý tưởng, source code, hoặc bài viết càng tốt, để làm phong phú thêm chuyên mục, vì thành thật mà nói, mình chỉ có một chút thời gian rảnh vào cuối tuần (sau khi đã trừ hết một đống thời gian ngủ nghỉ, ăn chơi, giải trí :D) để viết những bài chia sẻ cùng các bạn. Nên nếu chỉ một mình mình viết như hiện nay, số lượng bài viết của chuyên mục sẽ rất hạn chế, và khó lòng bao quát được hết các vấn đề các bạn quan tâm.

Hãy chia sẻ, các bạn sẽ nhận được nhiều hơn thế J. Mọi đóng góp, ý kiến xin gửi về địa chỉ emailhunterbmt@gmail.com J

Dự kiến ,toàn bộ các bài viết trong chuyên mục này sẽ gồm ba phần chính :

- Trò chuyện cuối tuần: Mình không muốn biến chuyên mục này thành những dòng chữ khô khan. Do đó phần trò chuyện này sẽ được thêm vào bài viết. Mình sẽ tổng hợp các ý kiến, những chia sẻ của các bạn trong những tuần trước vào phần bài này J. Còn nếu không có ý kiến gì, mình sẽ tự sướng cả phần.

- Nội dung chính: Vẫn như bình thường, phần nội dung chính sẽ bao gồm cả lý thuyết, lẫn những ví dụ đan xen

- Tổng hợp: Phần nội dung mới này cũng được thêm vào, nhằm giúp các bạn có 1 cái nhìn tổng quan về những gì mình đã được chia sẻ trong bài viết, nhằm giúp các bạn có thể nhớ lâu hơn, cũng như hệ thống kiến thức của mình dễ dàng hơn

Các bài viết của chuyên mục này sẽ được upload khoảng 2-3 tuần một số. Ví dụ loạt bài viết case study –miniFace của mình tuần hiện tại là số 1, thì khoảng 2-3 tuần sau sẽ có số thứ 2. Nhưng nếu kieutrongkhanh.net nhận được nhiều đóng góp có giá trị từ các bạn. Mật độ có bài viết mới sẽ được tăng lên. Ví dụ ngay tuần sau, có thể có bài mới về case study nào đó, do chính bạn đọc đóng góp. Dĩ nhiên, kieutrongkhanh.net chỉ sử dụng bài viết, còn bản quyền vẫn thuộc về tác giả J

Vậy là xong phần giới thiệu, câu giờ về chuyên mục mới. Chúng ta sẽ bắt đầu số đầu tiên của case study MiniFace .

1. Trò chuyện cuối tuần:

Mặc dù đã nói ở trên rất dài, nhưng đã có khung, vì vậy phần trò chuyện cuối tuần này vẫn được xuất hiện. Nếu các bạn không muốn tiếp tục mất thời gian, có thể bỏ qua ngay tới phần 2 – Nội dung chính .

Hai tuần qua thực sự là trải nghiệm rất thú vị với mình. Mình đã lóc cóc lên vietnamworks.com, nộp hồ sơ xin việc cho khoảng tầm 5-6 công ty mà mình thấy ưng ý. Nhưng chỉ 3 trong số đấy là có phản hồi. Sau hơn 1 tuần chạy ngược xuôi, mình chỉ muốn chia sẻ với các bạn một số điều mà mình nghĩ, sẽ có ích cho các bạn sau này nếu muốn xin việc

- CV cực kỳ quan trọng: Khoảng 80% bạn bè của mình-hiện tại vừa kết thúc năm 3, không có CV sẵn nằm trong máy. Và không ít người trong số đấy, đã phải ngậm ngùi bỏ qua nhiều cơ hội, đơn giản chỉ vì họ biết thông tin quá tr, khi chỉ còn khoảng 1 ngày để nộp CV. Họ vội vàng làm CV và dĩ nhiên, thời gian càng ít, thiếu sót càng nhiều. CV của họ không hề đủ chất lượng để được lọt vào vòng tiếp theo. Do đó, theo mình, các bạn nên có sẵn một CV hoàn chỉnh, được update gần nhất trong khoảng 2 tuần trở về trước và nên giữ cho bản CV này được cập nhật thường xuyên. Bản thân mình, có ấn tượng rất tốt với những người có thể gửi CV cho mình trong khoảng 5 phút sau khi được yêu cầu. Vì điều này chứng tỏ họ nghiêm túc với nghề nghiệp của mình.

- Bài test đầu vào đôi khi cực kỳ vớ vẩn: Mình từng chạy khoảng 30km, tới một công ty nước ngoài. Bước vào công ty, la liệt MAC, và các developer đang gõ ruby một cách khí thế. Nhưng khi bước lên phòng phỏng vấn, mình được giao cho một đề thi GMath để thực hiện trong vòng 30p, với 30 câu hỏi và không hề được báo trước. Mặc dù, vị trí mình ứng tuyển là lập trình viên với 2 năm kinh nghiệm. Dĩ nhiên, mình nộp giấy trắng và đi về J. Vì sau khoảng 2 năm không còn đụng đến GMath, việc làm 30 câu trong vòng 30p là bất khả thi. Vì thế, thỉnh thoảng bài test của các công ty khá vớ vẩn, bạn không làm được, không có nghĩa bạn phải kết thúc sự nghiệp của mình ở một cty nhỏ xíu nào đấy, với lương tháng 4-5 tr. Mà chỉ đơn giản, bạn không hợp với công ty đấy.

- Công ty to chưa hẳn tốt: Trong ngành phần mềm, to chưa chắc tốt. Nếu không tin, các bạn có thể nhìn vào Instagram với 13 nhân viên, với định giá tỷ đô. Bản thân mình đã được trải nghiệm tầm 8 tháng ở một công ty phần mềm thuộc loại lớn nhất HCM. Ở ngoài đẹp, chưa chắc bên trong đã tốt. Nếu có thể, các bạn nên chọn một công ty start up, vì xung quanh toàn những con người hừng hực lửa, sẽ tốt hơn nhiều lần, so với cố gắng cháy giữa những con người an phận làm công ăn lương

- Quan trọng là học được gì: Kiến thức luôn quan trọng vì nó chả bao giờ mất giá như việt nam đồng. Hãy chọn 1 công ty, mà các bạn nghĩ mình có thể học được rất nhiều ở đấy. Được vọc tay vào những framework chục ngàn đô chẳng hạn

Hiện tại thì mình đầu quân về hoiio.com rồi. Thời gian tới có khóc than hay không thì không biết, nhưng hiện tại thì lửa cháy to lắm

Chúng ta vào phần chính ngay bên dưới sau khi chia sẻ một ít kinh nghiệm

2. Nội dung chính:

Case study của chúng ta trong số này là miniFace, một mạng xã hội thu nhỏ. Tại sao chọn mạng xã hội làm case study? Sao không sử dụng những ứng dụng CRUD đơn giản như bình thường? Theo mình , nếu các bạn bám sát, đọc hết những gì kieutrongkhanh.net cung cấp, các bạn có thể bỏ qua những ứng dụng CRUD ngay từ cái nhìn đầu tiên, quá đơn giản. Do đó mình chọn mạng xã hội làm case study vì mình muốn chứng minh cho các bạn, những gì các bạn học được, sở hữu được, hoàn toàn có thể kết hợp với nhau, và xây dựng một thứ rất to lớn  như người khác vẫn làm ( chữ mini giới hạn sự to lớn lại nhé, mình sẽ không hướng dẫn xây cả cái facebook lại đâu, tốn nhiều thời gian lắm ) .

Đúng như nội dung của kỳ này, chúng ta sẽ chỉ chuẩn bị đồ chơi: download tool, thư viện cần thiết, setup môi trường. Mục tiêu, là chúng ta cần hiểu rõ, từng món đồ chơi một trong tủ đồ, và không “ngạc nhiên chưa” mỗi khi chúng ta sử dụng chúng trong loạt bài tiếp the .

Nhiếu bạn sẽ cảm thấy việc làm này vớ vẩn, setup môi trường, download tool, có gì khó nào . Nhưng mình đã gặp, một người bạn của mình, cũng thuộc loại khá về lập trình, sử dụng hibernate, nhưng hoàn toàn không hiểu gì về nó, ngoài việc plugin của netbean gen ra các Entity và cứ thế dùng. Khi người bạn này mang project của mình ra, giới thiệu với mọi người, cậu ta đã phải đối mặt với kha khá câu hỏi mà cậu không thể trả lời. Mình không muốn kieutrongkhanh.net biến các bạn thành những cái máy copy, hãy hiểu và sử dụng, đừng nhìn và copy.Hơn nữa, việc setup môi trường này đã xử mất của mình 1 buổi tối, chỉ vì vài sai lầm nho nhỏ đấy.

Hộp đồ chơi của chúng ta sẽ gồm :

- Spring 3.0: Cực mạnh, cực tốt cho sức khỏe .

- MongoDB : Hot boy hiện tại

- Spring Data: Thư viện hỗ trợ tương tác với MongoDB

- Twitter bootstap: Đơn giản hóa CSS , làm đẹp không khó

- JQuery: Javascript ? Đơn giản thôi mà .

- STS (Spring Tool Suite): IDE hợp thời với Spring .

- JDK 1.7 : Lõi của mọi thứ

Ok , chúng ta sẽ xem xét từng thứ một , cũng như cách cài đặt của chúng .

Spring 3.0: Spring là một framework rất phổ biến của Java developer. Mạnh mẽ, linh động là hai từ chính xác nhất khi nói về Spring. Cung cấp cho developer gần như mọi thứ để tạo ra một application mềm dẻo đúng nghĩa, không chỉ là web application mà với cả stand-alone application. Mặc dù vậy, chúng ta sẽ không sử dụng toàn bộ Spring framework (Thật ra mình cũng không hiểu hết nó ) mà chúng ta sẽ chỉ sử dụng các phần chính như: SpringMVC, Spring AOP vào ứng dụng của mình .

Không cần download, vì toàn bộ thư viện đã nằm trong bộ STS của chúng ta.

MongoDB: NoSQL là một công nghệ cũ, nhưng được relauch và tạo ra hiệu ứng mạnh gần đây và MongoDB là hệ quản trị CSDL dành cho NoSQL (tương tự như SQLServer , MySQL dành cho SQL vậy). MongoDB là một document-oriented database, với việc quản lý data dưới dạng JSON-like document với cấu trúc động. Để dễ hình dung, các bạn có thể xem ví dụ bên dưới

Giả sử, chúng ta có một table như hình dưới trong SQL

Điều này có nghĩa, mọi record của table trên, đều có và chỉ có 3 attributes Last Name, 
First Name và Date of Birth . Nếu bạn muốn thay đổi, thêm, hoặc xóa bớt 1 attribute, tất cả các record còn lại đều sẽ bị ảnh hưởng. Nhưng với document-oriented của MongoDB

Hoàn toàn có thể tồn tại 2 record (với mongodb là document) thuộc cùng một table (với mongodb là collection) nhưng số lượng attribute khác nhau. Điều này có ý nghĩa rất lớn, tới tính mở rộng của ứng dụng . Bạn sẽ thoải mái thay đổi số lượng attribute của một record, mà không ảnh hưởng gì tới các recode khác. Ví dụ:

Đồng thời, cách lưu trữ key: value tương tự như hashmap, giúp tốc độ truy xuất data của chúng ta tăng lên nhiều lần .

Có thể nói, mongodb là lựa chọn rất thích hợp, để chuyển dịch từ Relations DB bình thường sang sử dụng NoSQL .

Download: http://www.mongodb.org/downloads (Các bạn nên chọn đúng phiên bản hệ điều hành của mình, bản x86 có thể hoạt động trên x64 , những có thể tiềm ẩn một số lỗi)

Cách cài đặt:

Với thự mục mongodb.zip vừa tải về, các bạn có thể giải nén ở bất kỳ đâu. Ở đây mình chọn ổ C, và đổi tên thành mongodb.

Các bạn tạo thêm 2 thư mục, data (để chưa database) và logs(chứa log file )

Trong thư mục logs, các bạn tạo tập tin mongolog.txt.

Mở command line với quyền admin

Trỏ thư mục hiện hành tới C:/mongodb/bin

Trong thư mục bin, chúng ta có thể thấy

Hai file các bạn cần chú ý, đó là mongo.exe để thực thi các query thông qua cmd và mongod.exe để chạy mongodb .

Chúng ta khởi động mongodb bằng commend line như sau:

Với dbpath là đường dẫn nơi lưu database. ( Lưu ý ,nếu thiếu option này , với version 64bit mà mình thực nghiệm, mongodb sẽ stop ngay sau khi khởi động và các bạn sẽ không thể tương tác với mongodb)

Sau đó, chúng ta sẽ test thử mongodb của mình như sau

Như các bạn thấy, chúng ta gọi mongo.exe để thực hiện query bằng commend line . Database mặc định của mongodb khi khởi tạo là “test” và collection chúng ta sử dung cũng là “test”

Với dòng lệnh

Db.test.save({“a”:1})

Chúng ta đã thêm vào collection “test” một document với attribute “a” = 1

Lệnh db.test.find() giúp chúng ta get tất cả các document thuộc collection test.

Như vậy, mongodb của chúng ta đã hoạt động bình thường.

Tiếp theo, chúng ta sẽ phải cài đặt mongodb thành 1 service của Windows và cho phép service này tự khởi động.(Nếu các bạn có vọc các RDBM như SQLServer hay MySQL ,các bạn có thể tìm thấy service của những DBM này được khởi động tự động khi windows khởi động, do đó, các bạn có thể tương tác với chúng gần như ngay lập tức)

Các bạn sử dụng dòng lệnh sau :

Trong đó, logpath là đường dẫn tới file chưa log của mongodb (chúng ta đã khởi tạo ở trên)

Tuy nhiên, chúng ta vẫn phải thay đổi thêm một chút, để service mongodb của chúng ta hoạt động một cách bình thường (theo Mongodb.org họ sẽ sửa lỗi này ở version sau)

Các bạn vào run

và gõ RegEdit

Tìm đến từ khóa như hình

Chúng ta sẽ thay đổi imagePath như sau :

"C:\mongodb\bin\mongod.exe" --service  --rest  -master  --logpath=C:\mongodb\logs\mongolog.txt  --dbpath=C:\mongodb\data

Trong đó, dbpath là đường dẫn tới thư mục lưu database mà chúng ta đã khởi tạo ở trên .

Sau khi thực hiện xong , các bạn vào Service.msc để kiểm tra

Nếu muốn control toàn bộ việc khởi động cũng như kết thúc của Service này. Các bạn có thể chuyển từ Automatic sang Manual và sử dụng lệnh Net start MongoDB / Net stop MongoDB để đóng mở service.

Spring Data : Là một thư viên do cộng đồng Spring phát triển với mục đích đơn giản và tối ưu hóa việc tương tác với các database, trong đó có MongoDB .Các ban có thể tham khảo thêm tại :http://www.springsource.org/spring-data/mongodb

Version chúng ta sử dụng sẽ là version 1.1M1

Download : http://www.springsource.org/download/community?project=Spring%2520Data%2520MongoDB&version=1.1.0.M1

Twitter bootstap: Là một thư viện mã nguồn mở bao gồm Css. HTML và cả một phần của JQuery, mục đích của bộ thư viện này, là hỗ trợ lập trình viên, tạo ra website đẹp hơn, linh động hơn, với ít công sức nhất.

Download tại: http://twitter.github.com/bootstrap/

JQuery: Bộ thư viện phổ biến nhất của Javascript với mục đích thay đổi cách viết javascript của lập trình viên. Còn với mình, nó giúp viết JS đơn giản hơn.

STS (Spring Tool Suite): Món đồ chơi mà các bạn nên làm quen, nếu đã lỡ yêu Spring từ cái nhìn 1,2,3,4 gì đấy . Đây là một bản mod của IDE eclipse nổi tiếng dành riêng cho Spring do cộng động Spring thực hiện. STS bao gồm đầy đủ các thư viên, plugin mà một lập trình viên Spring cần dùng tới. Các bạn hoàn toàn có thể dùng Netbean, nhưng thành thật mà nói, với NetBean, khả năng vọc và phá của chúng ta sẽ hạn chế khá nhiều do tập tính ỷ lại vào plugin .

Ngoài ra, STS còn kèm theo một server khá độc vFabric tc Server thứ được quảng cáo là tối ưu hóa cho Spring .

Download tại http://www.springsource.org/downloads/sts-ggts (như thường lệ, tải đúng phiên bản hệ điều hành của bạn. Đặc biệt, phiên bản STS x64 sẽ không thể hoạt động với jdk x86)

Về phần cài đặt khá đơn giản, tương tự như eclipse , có hai version là bản zip và bản windows installer, theo mình các bạn nên sử dụng bản windows installer vì việc cấu hình sẽ được thực hiện tự động, và hình nền lúc cài đặt cũng rất đẹp J)

Sau khi cài đặt, chúng ta sẽ có giao diện như sau:

Chúng ta sẽ tiến hành tạo project cho case study này như sau:

File>New>Spring>Spring Template Project > Spring MVC Project

STS template project có một tính năng khá hay, làm tên package của chúng ta bắt buộc phải theo chuẩn (như hình trên) nếu không sẽ không thể khởi tạo. Nhằm tránh việc chúng ta đặt tên package bừa bãi, một thói quen không tốt.

Sau khi tạo xong project, project chúng ta có dạng như sau :

STS sử dung maven để build các project của mình, do đó chúng ta có thể thấy file pom.xml để cấu hình việc build.

Như vậy, chúng ta đã setup xong toàn bộ môi trường cho case study của mình .Chúng ta sẽ tiếp tục tìm hiểu phần tiếp theo, Big Picture.

Big Picture

MiniFace là gì ?

MiniFace là một mạng xã hội rút gọn, với các tính năng chính như: Post status, Comment , Like,  Add friend .

MiniFace sử dụng Ajax như một công nghệ chủ đạo ở Front–end và Spring MVC là công nghệ chủ đạo ở Back-end cùng với MongoDB.

Vì sao cần thực hiện Case Study này?

Sau khi thực hiện case study này một cách nghiêm túc, các bạn có thể đạt được :

- Tăng kỹ năng giải quyết vấn đề (trong case study sẽ có những phần ẩn implement chỉ đưa ra hướng giải quyết và các bạn cần tự mình hiện thực)

- Làm quen với hai công nghệ mới là Ajax và NoSQL

- Làm quen với việc kiến trúc ứng dụng tách biệt , linh hoạt để đạt hiệu quả cao khi sử dụng Spring Framework .

- AOP, IoD không còn quá xa lạ .

Kiến trúc ứng dụng

Chúng ta sẽ sử dụng kiến trúc tách biệt như trên, đồng thời cố gắng che dấu implement bằng interface nhiều nhất có thể (một cách hợp lý) nhằm sử dụng IoD của Spring framework một cách hiệu quả nhất .

** Thử thách: MiniFace có bốn tính năng chính : Post status, Comment, Like và Add Friend. Các bạn có thể thiết kế lớp ORM cho case study của chúng ta được không? Được biết, với ORM, database sẽ hoàn toàn bị che dưới góc nhìn từ trên xuống của lập trình viên (có nghĩa ORM của MongoDB hay SQLServer chỉ khác nhau ở file config )

Tổng kết:

Trong kỳ này, các bạn đã :

- Có cái nhìn tổng quan về việc chúng ta sẽ sử dụng gì và làm gì

- Những kiến thức cơ bản về MongoDB, ST, SpringData

- Một thử thách thiết kế ORM cho case study này.

Trong kỳ tiếp theo : Thiết kế - vấn đề muôn thủa.

Rất mong nhận được sự ủng hộ cũng như đóng góp của các bạn cho chuyên mục mới. Mọi ý kiến, đóng góp xin gửi về hunterbmt@gmail. Xin chân thành cảm ơn

Tags: