Note về CNPM

By Vy Tien

Note về CNPM

Waterfall approach

Predictive approach

  • 3 things we wish:
    • Customer knows what he/she wants
    • Dev know how to build it
    • Nothing will change along the way
  • 3 things we live with
    • Customer discovers what he/she wants
    • dev discover how to build it
    • many things change along the way

Làm product: công nghệ thay đổi chậm, rủi ro khi chuyển công ty, ít cơ hội Làm outsource (gia công): công nghệ thay đổi nhanh, rủi ro khi phải học công nghệ mới, cơ hội nhiều.

Không chọn feature dễ để làm, phải chọn những features có giá trị để làm. Không phải feature nào cũng có giá trị như nhau.

Agile solution

Chuẩn bị sẵn các feature, usecase cần làm. Tập trung ở các feature khó, nếu thất bại ⇒ xác định sớm để loại sớm. Xác định usecase có giá trị ⇒ làm càng sớm càng tốt (as soon as possible)

MVP? Minimum viable product ⇒ xác định chức năng mang giá trị nhiều nhất làm trước.

Tập trung 20% vào 80% giá trị ⇒ Làm nhanh phần mềm ⇒ sau đó thêm các chức năng phụ trợ vào.

Phương pháp Agile ⇒ Làm theo chuẩn tên lửa ⇒ dễ dàng đáp ứng theo requirement.

Waterfall ⇒ Gần cuối giai đoạn mới có sản phẩm ⇒ Plan driven, from estimated resources, time, features to fixed requirements, resources, time

Agile ⇒ Sản phẩm sẵn sàng trong thời gian ngắn, dễ demo cho khách hàng. ⇒ Value driven, from fixed requirements, resources, time to fixed requirements, resources, time

Làm phần mềm hiện theo 2 hướng:

  • Fixed (cố định về giá trị)
  • Body shopping (thuê nhân viên)

Dự án nào phù hợp với Waterfall: có requirement ngay từ đầu, có nguồn nhân lực chất lượng cao (master về một lĩnh vực), dễ dàng lên kế hoạch chi tiết.

Dự án nào phù hợp với Agile: requirement ít, nguồn nhân lực cần đào tạo (công nghệ mới,…), dễ dàng triển khai demo cho khách hàng.

Về đồ án

Mô tả đồ án môn học (chỉ là gợi ý, có thể tuỳ chỉnh theo người làm)

  • Yêu cầu (nói lên phần mềm làm được chức năng gì, có chức năng gì, yc của hệ thống - yc chức năng vs phi chức năng, là giải pháp để giải quyết nhu cầu sd). Viết lại giải pháp thành 4 mục:
    • Giới thiệu tổng quan về hệ thống, giới thiệu bối cảnh ra đời của phần mềm. Phần mềm ra đời giúp ích những gì… ⇒ Thấy được sự cấp thiết phải ra đời phần mềm này ⇒ Vẫn là giới thiệu tổng quan. Mô tả chung
    • Số mục không cần thiết phải giống hoàn toàn, nhưng vẫn phải đảm bảo được yêu cầu từng phần.
    • Yêu cầu chức năng: usecase, các diagrams
    • Phi chức năng: bảo mật, tốc độ,…
    • Yêu cầu chung về phần mềm:
      • Yêu cầu chính mà phần mềm có thể giải quyết
      • Chức năng cụ thể. Mô tả chi tiết. Vẽ usecase, đặc tả, vẽ vài màn hình quan trọng.
      • Quy trình nghiệp vụ: không có không cần viết. Có phải ghi chi tiết.
      • Mục đích: hệ thống này mục đích làm gì, làm được những gì.
  • Thiết kế
    • Cơ sở dữ liệu (logic, physical)
    • Giao diện (chi tiết), có thể dùng giao diện thực tế. Đặc tả trên từng màn hình.
    • Class diagram, sequence diagram cho từng usecase.
  • Kiểm thử
    • Test design và test case cho từng usecase.
  • Báo cáo kq đạt được.

Tài liệu tầm dưới 200 trang. Khi nhận mẫu, cần hỏi người gửi về ý tưởng của mẫu (template) đó. Test design: các vấn đề cần kiểm tra Test case: kiểm tra các vấn đề đó. (cần thực hiện bước gì để kiểm tra vấn đề đó).

Class diagram

classDiagram
	direction RL
	Model <|-- Permission
	Model <|-- Role
	Model <|-- User
	Model <|-- Order
	Model <|-- Product
	Model <|-- Category
	Model <|-- OrderProduct
	Model <|-- Cart
	Permission "0..*" -- "0..*" Role
	Role "1" -- "0..*" User
	User "1" .. "0..1" Cart
	User "1" o-- "0..*" Order
	Order "0..*" -- "0..*" Product : "Có"
	Product "0..*" --* "1" Category
	Order .. OrderProduct
	OrderProduct .. Product
	class Permission {
		- id: int  
		- name : string  
		- decription: string
		+ roles() BelongsToMany
	}
	class Role {
		- id: int
		- name: string
		- description: string
		+ users() HasMany  
		+ permissions() BelongsToMany
	}
	class User {
		- id : int  
		- name : string  
		- phone : string  
		- email: string  
		- status : int  
		- password: string  
		- role_id: int
		+ role() BelongsTo
	}
	class Order {
		- id : int  
		- user_id: int  
		- name_receiver: string  
		- address_receiver: string  
		- phone_receiver: string  
		- email_receiver: string  
		- note: string  
		- sub_total: double  
		- fee_ship: double  
		- total: double  
		- payment_status: int  
		- order_status: int
		+ user() BelongsTo  
		+ orderProducts() HasMany
	}
	class Product {
		- id : int  
		- thumb_image: string  
		- name: string  
		- slug: string  
		- category_id: string  
		- decription: string  
		- content: string  
		- price: double  
		- status: int
		+ category() BelongsTo
	}
	class Category {
		- id: int  
		- name: string  
		- slug: string  
		- icon: string  
		- status: int
		+ products() HasMany
	}
	class OrderProduct {
		- id : int  
		- oder_id: int  
		- product_id: int  
		- product_price: double  
		- product_name: string  
		- qty: int
	}
	class Cart {
		- id: int  
		- user_id : int  
		- cart_items: string
		+ clear(): void  
		+ getCartItems() array
		+ deleteCartItem(idItem : int) void
		+ saveCart(idProduct: int, qty:int) void
	}
	class Model {
		# fillable: array  
		# hidden: array  
		# casts : array
	}
	<<Abstract>> Model

Written with passion in Software Technology’s class by lecturer Nguyen Thanh Phuoc - SGU

Tags: cnpm
Share: Twitter Facebook LinkedIn