2008年7月22日 星期二

JPA 應用實例 <2>

第二步:撰寫JPA基本維護程式

  1. 撰寫 ProductItem 與 Category 兩支Bean程式,寫好getter/setter & constructor

/**

* 產品基本資料

* @author TommyKao

*/

public class ProductItem {

/**

* 產品系統編號

*/

private long id;

/**

* 產品編號

*/

private String sku;

/**

* 產品名稱

*/

private String name;

/**

* 產品描述

*/

private String description;

/**

* 以下是 constructor 的宣告

*/

protected ProductItem() {

super();

}

public ProductItem(String sku, String name) {

super();

this.sku = sku;

this.name = name;

this.description = "";

}

/**

* 以下是 getter/setter 的宣告

*/

public long getId() {

return id;

}

protected void setId(long id) {

this.id = id;

}

public String getSku() {

return sku;

}

protected void setSku(String sku) {

this.sku = sku;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

}

  1. 利用 Annotations 宣告 JPA 管理的 Entity ,相關 Annotations 的用法其實跟採用XML 宣告的 OR Mapping 非常類似,只不過Annotations 是直接寫在 Bean 裡頭,相應的宣告及案例如下:


Annotations

說明與案例

@Entity

宣告為一般的Entity
…
@Entity
public class ProductItem {
…
}

@Id

宣告 Entity Bean 對應到永續層(persistence) 的primary key
…
public class ProductItem {
@Id
private long id;
…
}

  1. JPA Annotations 方式除了由開法者自行輸入之外,也可以透過 Eclipse 的 UI 來設定。

    1. 開啟 JPA Structure 與 JPA Detail 兩個視景,如以下圖例,從圖例當中我們可以看到,當我們編輯 Java Bean 程式時,對應的 JPA Structure 視景當中可以看到對應的屬性(attributes),同時 JPA Details 可以看到可用的 JPA Annotations 設定清單,也就是說,我們可以點選JPA Structure當中的屬性然後在JPA Details當中設定適當的值即可。

    1. 以下圖例是透過JPA Structure & JPA Details設定的簡單案例,操作步驟說明如下:

      1. JPA Structure當中點選Category 類別名稱,將可以看到JPA Detail 當中出現對應的設定選項,於 Map AS 下拉選項當中選定Entity,該設定會立即反應回對應的程式碼當中,並出現正確的JPA Annotations 宣告 @Entity

      1. 於JPA Structure當中點選Category 類別的 id 屬性,可以看到JPA Detail 當中出現對應的設定選項,於 Map AS 下拉選項當中選定Id,JPA Annotations 宣告 @Id會立即反應回對應的程式碼當,注意到,JPA Structure 視景當中看到的 id 屬性會出現一把鑰匙,表示為 primary key。

      1. 於JPA Structure當中點選Category 類別的其他屬性,可以看到JPA Detail 當中出現對應的設定選項,於 Map AS 下拉選項當中選定預設的Basic,並可於 Name 下拉選單中直接輸入該屬性對應到永續層的欄位名稱 ,這邊要注意的是,有些JPA Annotations Tag 並未出現在JPA Detail當中,例如 length,這部分就需要手動指定了。

  1. 設定完基本的 JPA Annotations 之後,請把 META-INFpersistence.xml 打開,內容當中可以看到前面設定的 Entity 已經設定包含在<class> … </class> 標籤中了。

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="1.0"

xmlns="http://java.sun.com/xml/ns/persistence"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

<persistence-unit name="JPASample1">

<class>sample.jpa.Category</class>

<class>sample.jpa.ProductItem</class>

</persistence-unit>

</persistence>

  1. 現在要著手開始寫MVC 當中的 Model 層服務,在撰寫 Model 層服務之前,建議各位先行定義開發的界面程式。
    以下是本次演練要開發的服務

/**

* ICatalogService 提供的標準服務介面定義

* @author TommyKao

*/

public interface ICatalogService {

/**

* 依照商品分類的 primary key 找到對應的分類資料

* @param id

* @return

*/

public Category findCategoryByID(long id);

/**

* 儲存商品分類資料

* @param category

* @return

* @throws Exception

*/

public Category saveCategory(Category category) throws Exception;

}

  1. 介面定義完成後,開發者便可以著手開發核心商業邏輯了,基於 JPA 的核心商業邏輯分段說明如下:

public class CatalogService implements ICatalogService {

/**

* Singleton pattern

*/

private static CatalogService instance = new CatalogService();

/**

* 永續層的進入點 EntityManagerFactory

*/

private static EntityManagerFactory entityManagerFactory;

private CatalogService() {

super();

if (entityManagerFactory==null) {

try {

// 取得 EntityManagerFactory

entityManagerFactory = Persistence

.createEntityManagerFactory("JPASample1");

} catch (Throwable ex) {

throw new ExceptionInInitializerError(ex);

}

}

}

public static CatalogService getInstance() {

return instance;

}

/**

* 依照商品分類的 primary key 找到對應的分類資料

* @param id

* @return

*/

public Category findCategoryByID(long id) {

Category result = null;

try {

// 取得 EntityManager

EntityManager em = entityManagerFactory.createEntityManager();

// 依照 primary key 找到對應的商品分類

result = em.find(Category.class, id);

return result;

} catch (NoResultException err) {

return null;

}

}

/**

* 儲存商品分類資料

* @param category

* @return

* @throws Exception

*/

public Category saveCategory(Category category) throws Exception {

Category persistNode = null;

if (category != null) {

persistNode = this.findCategoryByID(category.getId());

// 取得 EntityManager

EntityManager em = entityManagerFactory.createEntityManager();

EntityTransaction etx = em.getTransaction();

etx.begin();

if (persistNode != null) {

persistNode.setCaption(category.getCaption());

// 永續層已經有資料, 用 Merge 方式執行修改(update)動作

category = em.merge(persistNode);

} else {

em.persist(category);

}

etx.commit();

em.close();

persistNode = category;

}

return persistNode;

}

}

  1. 執行測試程式,為了簡單起見,本例是採用 main方法撰寫測試程式,這邊要提醒各位的是,為了完整與方便日後測試,建議各位還是採用 JUnit 撰寫測試程式較為妥當,至於JUnit 測試程式該如何撰寫,還請各位另行參閱相關的文章。

    1. 範例程式如下:

/**

* @param args

*/

public static void main(String[] args) {

ICatalogService service = CatalogService.getInstance();

Category category = new Category("JAVA JPA");

try {

category = service.saveCategory(category);

System.out.println("saveCategory Caption : " +(category!=null?category.getCaption():"DATA NOT FOUND"));

} catch (Exception e1) {

e1.printStackTrace();

}

Category result = service.findCategoryByID(1);

System.out.println("findCategory Caption : " +(result!=null?result.getCaption():"DATA NOT FOUND"));

}


    1. 執行範例程式時,在 Console 當中應該會看到以下的錯誤訊息,原因在於資料庫定義與相關的資料表並未設定或者出使劃完成所致,因此,我們須要回頭把資料庫相關設定寫到 META-INFpersistence.xml設定檔之中。


    1. META-INFpersistence.xml設定檔需補充設定資料庫連線方式如下。

    2. 設定完成後,再次執行測試程式,將可得到正確結果如下圖。

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="1.0"

xmlns="http://java.sun.com/xml/ns/persistence"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

<persistence-unit name="JPASample1">

<class>sample.jpa.Category</class>

<class>sample.jpa.ProductItem</class>

<properties>

<!-- 資料庫類型 -->

<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>

<!-- 資料庫 JDBC 驅動程式 -->

<property name="hibernate.connection.driver_class" value="net.sourceforge.jtds.jdbc.Driver" />

<!-- 資料庫連線 URL -->

<property name="hibernate.connection.url" value="jdbc:jtds:sqlserver://localhost:1433/jpadb" />

<!-- 資料庫連線使用者帳號 -->

<property name="hibernate.connection.username" value="jpauser" />

<!-- 資料庫連線使用者密碼 -->

<property name="hibernate.connection.password" value="jpauser" />

<!-- 資料庫 Scheam 有差異時的處理方式 -->

<property name="hibernate.hbm2ddl.auto" value="update"/>

</properties>

</persistence-unit>

</persistence>

  1. 撰寫更多的商業邏輯程式,JPA 的 Persistence 主要是使用 Entity Manager 去執行一般的增、刪、改、查動作,相關的範例逐一說明如下。

    1. 設計標準介面,例如:查詢、新增、修改與刪除等介面,以下是本實例當中開立的部分案例。

public interface ICatalogService {

/**

* [PK查詢範例]依照商品分類的 primary key 找到對應的分類資料

*/

public Category findCategoryByID(long id);

/**

* [新增與修改範例]儲存商品分類資料

*/

public Category saveCategory(Category category) throws Exception;

/**

* [刪除範例]刪除商品分類資料

*/

public void removeCategoryByID(long id);

/**

* [一般查詢範例]依照產品編號 (SKU) 找到對應的產品基本資料

*/

public ProductItem findProductItemBySku(String sku);

其他…
}

    1. PK查詢範例:Entity Manager 有一個 find() method 可以直接用物件的 Primary Key 到永續層查詢對應的物件,實際用法與範例如下:

/**

* [PK查詢範例]依照商品分類的 primary key 找到對應的分類資料

*/

public Category findCategoryByID(long id) {

EntityManager em = entityManagerFactory.createEntityManager();

// 依照 primary key 找到對應的商品分類

Category result = em.find(Category.class, id);

return result;
}

    1. 新增或者修改範例:若需要修改紀錄,建議採用 merge() method

/**

* [新增與修改範例]儲存商品分類資料

*/

public Category saveCategory(Category category) Exception {

if (category != null) {

Category persistNode = this.findCategoryByID(category.getId());

EntityManager em = entityManagerFactory.createEntityManager();

EntityTransaction etx = em.getTransaction();

etx.begin();

if (persistNode != null) {

persistNode.setCaption(category.getCaption());

// 永續層已經有資料, 用 Merge 方式執行修改(update)動作

category = em.merge(persistNode);

} else {

// 新的資料資料, 用 Persist 方式執行新增(insert)動作

em.persist(category);

}

etx.commit();

em.close();

}

return persistNode;
}

    1. 刪除範例:若需要修改刪除紀錄時,請使用 remove() method 去整理各項分類

/**

* [刪除範例]刪除商品分類資料

*/

public void removeCategoryByID(long id) {

// 取得 EntityManager

EntityManager em = entityManagerFactory.createEntityManager();

EntityTransaction etx = em.getTransaction();

etx.begin();

Category category = em.find(Category.class, id);

if (category!=null) {

em.remove(category);

}

etx.commit();

em.close();
}

    1. 一般查詢範例:除了用PK查詢之外,若開發者希望依照其他的條件去查詢時,可採用HQL語法,HQL 跟SQL 語法非常類似,差異在於 SQL 的對象是資料表與欄位,而 HQL 的對象則是類別與屬性,以下為一般查詢的範例程式。

/**

* [一般查詢範例]依照產品編號 (SKU) 找到對應的產品基本資料

*/

public ProductItem findProductItemBySku(String sku) {

String hql = "from ProductItem where sku=:sku ";

// 取得 EntityManager

EntityManager em = entityManagerFactory.createEntityManager();

Query query = em.createQuery(hql); // 建立查詢語法

query.setParameter("sku", sku); // 填入查詢條件

// 依照產品編號 (SKU) 找到對應的產品基本資料

ProductItem result = (ProductItem) query.getSingleResult();

return result;

}

/**

* [一般查詢範例]依照產品編號 (SKU) 找到對應的產品基本資料

*/

public ProductItem findProductItemBySku(String sku) {

String hql = "from ProductItem where sku=:sku ";

// 取得 EntityManager

EntityManager em = entityManagerFactory.createEntityManager();

// 相同的語法可以濃縮成以下這行

ProductItem result = (ProductItem) em.createQuery(hql)

.setParameter("sku", sku).getSingleResult();

return result;

}




待續...JPA 應用實例 <3>

2008年6月19日 星期四

軟體設計思維

彙整這些年來的軟體設計想法, 在這當中有很多觀念, 有些我們都知道了, 但也有些並沒有被大家重視, 整理這些資料主要是希望能有拋轉引玉的效果, 或許, 各位有更多的心得也可以提出來分享 & 討論

1. 本職學能應該掌握哪些?
  • Programming Skills
  • Object Oriented Concept
  • MVC, Model-View-Controller
  • UML, Unified Modeling Language
  • Quality Control


  • 2. 進階知識涵蓋層面?
  • Advanced Programming Skills
    Refactoring, ORM, XML ...
  • GoF Design Patterns
  • Quality Assurances


  • 3. 提供哪些專業服務?
  • Concept Abstraction
  • Business Solutions
  • Domain Knowledge




  • 強力推薦:敏捷溯模(Agile Modeling)

    2007年5月11日 星期五

    UML 案例 <1> UseCase

    本電子商務用例展示了簡易版的電子商務使用情境,當中可以看到有三個主要的 Actors 分別是 Guest, Administrator 與 Payment GW,這邊特別要說明的是,Payment GW 並不代表特定角色的人,Payment GW 指的是提供金流授權服務的外部系統(例如:信用卡刷卡機)。

    另外,就是所謂的 Extension Point ,從圖例當中可以知道,在特定情況下會需要用到擴充的用例,如金流授權處理是信用卡付款方式的擴充。


    強力推薦:敏捷溯模(Agile Modeling)

    2007年4月23日 星期一

    問題追蹤與處理流程<2>

    議題(Issues) 可能來自於瑕疵、衍生需求、任務與改進的需要…等,每一個議題都需要被妥善地管理,因此,記錄的資訊是否完整將會影響到整體問題追蹤與處理流程的執行成效,筆者建議紀錄的資訊如下:

    1. 議題所屬專案-紀錄議題是屬於那一個專案,便於日後追蹤各專案的進展。
    2. 議題類型(Type)-例如:瑕疵、衍生需求、任務與改進的需要…
    3. 摘要說明
    4. 議題描述-說明議題發生的原因、流程、步驟…資訊,便於判讀各項議題。
    5. 環境說明-紀錄與本議題相關的各項元件(系統、子系統、元件)、版本、執行環境…等資訊。
    6. 優先等級-紀錄議題的優先等級,通常是工作次序安排的重要依據,常見的優先等級有關鍵議題(Critical)、主要議題(Major)、次要議題(Minor)、一般議題(Trivial)…等。
    7. 議題發起人
    8. 議題負責人
    9. 變更歷程-紀錄各項議題的狀態移轉過程、發生時間等歷史,透過各項統計分析技術,讓所有利害關係人能充分掌握所需的相關資訊。
    10. 議題解決方式-紀錄該項議題最後獲得解決的方式,

    坊間有許多的工具支持議題處理的應用過程,包括 BugZilla, Track+, JIRA, Mantis, Request Tracker, CodeBeamer…等工具,這些工具都有一致或類似的問題追蹤機制,問題單狀態的移轉過程也很類似 (請參閱下圖:問題單的狀態移轉過程)。



    透過工具的輔助將讓專案在議題追蹤與處理上達到事半功倍的成效;然而,筆者必須強調,工具絕非萬能,它僅能輔助我們妥善地管理議題,但議題不會自動消失,專案團隊必須積極、主動合作面對問題所帶來的挑戰。

    問題追蹤與處理流程<1>

    需求改變是專案的常態,專案執行過程中一定會有許多的議題發生,如果置之不理那麼議題不但不會自動消失,還可能累積成災,所以我們需要一套妥善的議題追蹤與處理機制,除了消極的紀錄議題,更要積極的掌握與處理、解決各項議題。

    管理與追蹤在專案開發與維護過程中發生的各議題(如:瑕疵、衍生需求、任務與改進等)是專案管理的基礎,但很少有團隊可以做的很好。透過Issue Tracking 工具提供的各項功能,讓問題追蹤管理根專案管理變得更容易上手,而且,工具本身提供的流程彈性與報表擴充性,也讓專案管理資訊系統(PMIS, Project Management Information System) 更趨於完善。

    一套比較完整Issue Tracking 工具,必須考慮到專案初始、規劃、執行、監控、結案過程中的各項需要,尤其是客戶、高階主管、專案經理、開發團隊、測試團隊、分析設計團隊…利害關係人的需要,如此才能讓工具本身發揮應有的效果。

    1. 客戶、高階主管
    依據Issue Tracking 工具提供的各項數據,準確地了解專案狀態、專案品質水準與團隊工作效率;一般而言,工具本身都會提供問題數、瑕疵密度、問題發展趨勢…等各種統計數據,讓高階主管可以更客觀地評估專案與團隊表現。

    2. 專案經理
    追蹤Issue Tracking 工具所列的各項問題,評估並指派任務給團隊同仁,同時可以根據工具本身提供的相關報表理解專案進展與同仁的工作情況,適時介入並提供任務相關的各項協助,提早發現並處理各項議題,讓議題不至於成為專案的重大風險。

    3. 開發團隊、分析設計團隊
    依據 Issue Tracking 工具所列的工作項目清單執行各項任務,團隊同仁可以聚焦於各項任務、解決問題,讓工作效率更加提升。在解決問題的過程中,各種問題的處理與解決方案也可以被妥善地記錄於工具中,日後更有機會累積並整理成為組織的知識庫(Knowledge Base)。

    4. 測試團隊
    執行問題結案之前的測試作業,並確實反應(紀錄)測試結果,讓專案經理與開發團隊能夠執行後續的跟催作業。


    上圖為常見的議題追蹤與處理流程,步驟說明如下:

    1. 問題發起-專案的所有利害關係人(客戶、專案經理、團隊成員、專案高階主管) 都可以提出問題單。
    2. 問題審議-專案經理初步審議各項問題,若議題涉及層面較大,則召開相關會議,邀請與會人員審議該項議題,並決定議題的後續處理原則同時紀錄理由,如:拒絕、暫緩、受理等過程。
    3. 受理並指派負責人-經過審議並確認處理原則後,問題單需指派給一位主要負責窗口,負責執行各項任務並妥善處理該項問題。
    4. 領案並解決問題-負責人收到任務指派後,負責規劃、執行、追蹤問題的處理過程,同時記錄問題的處理方式與處理結果。
    5. 結案審議-專案經理與問題發起人將初步審議各項問題是否獲得解決並同意結案,若議題涉及層面較大,則召開相關會議審議;結案審議過程若發現問題未被解決或者產生新的問題,可回到步驟1另行建立問題單或重啟問題單。

    2007年1月13日 星期六

    是否該導入 CMMI?

    上回的觀點中,筆者簡單說明了自己對於CMMI的認知,同時也為剛剛入門的朋友簡介了一下CMMI (能力成熟度模型) 的四大流程領域與能力成熟度觀點。

    這回我們將觸及朋友們經常提出的第一個問題,是否該導入 CMMI?導入 CMMI 真的也那麼大的好處?換句話說就是投資報酬率的問題?

    如果回答這問題的是CMMI輔導顧問,那麼多數顧問將引用許多的數據告訴你CMMI是多麼地好,能降低公司經營成本、改善公司體質…等等。真的可以單純地相信顧問們提出的數據?如果是降,為什麼通過 CMMI 三級認證的公司,做出來的XX系統還是會不斷遭受客戶質疑!系統的壓力耐受度是如此地脆弱嗎?

    除了從顧問們提供給的數據看到佐證外,我必須誠實地回答各位,CMMI 的精神是好的,不論從品質、成本、專案與風險管理的角度去看,他都有存在的價值與效益;但CMMI 是否能產生實質效益卻是事在「人為」,參與者用怎樣的心態去面對,絕對影響整件事情的發展,沽名釣譽者可以通過認證,苦幹實幹者也可以通過認證,但時間絕對會證明一切,剛剛說的XX售票系統不就是最佳的反例?

    看到這現象,筆者體會到「哀矜勿喜」的真正意涵,台灣的軟體產業真的如此不堪一擊?我們必須停下腳步,不要一味地說是大環境不好或者CMMI制度不適用於台灣的環境,因此抹殺前人的功勞!取而代之的應該是徹底檢討,到底問題出在什麼地方?我們在這個過程中學習到什麼?
    反省、檢討、改善並獲得所謂的Lessons Learned,不就是 CMMI 當中決策分析與解決方案(DAR: Decision Analysis and Resolution)反饋回流程管理領域 (Processes Management-組織流程焦點、組織流程定義、組織層級教育訓練…等)過程嗎?

    懂得檢討才能累積經驗(Lessons Learned)並達到持續改善的真諦。

    因此筆者認為各位應該關注的議題不是導入 CMMI 與否,或者一味地抗拒 CMMI,真正要提出的問題應該是:

    1. 組織/公司目前碰到了怎樣的難題?
    是控制不易、溝通不良、品質不佳、無法累積實力…什麼問題最嚴重?什麼問題做最急迫?輕重緩急?

    2. 公司的現況、遠景?
    有無實際可行的計畫與支持團隊?打算腳踏實地、突破創新還是繼續沽名釣譽?

    以上問題雖然嚴肅,但卻是真正值得深思的,有些朋友會告訴我,這些是公司老闆們應該顧慮的問題,不是我這種層級該管的,我了解不在其位不謀其政的想法,但是,山不轉路轉…,或許你可以轉寄一些資料給上司、同事,不論你是否考慮導入 CMMI,我都希望這篇文章能讓大家凝聚共識;大家逐步達成共識,就是進步~

    各位朋友們,無論將來職場如何發展,自己也可以累積一套Lessons Learned,反省、學習、累積與成長是進步的動力,如果能進而分享將可得到更多回饋。

    2007年1月7日 星期日

    CMMI 觀念 & 流程領域

    看到很多人在討論 CMMI , 我認為是喜憂參半的狀況, 喜的是越來越多人重視公司內部的能力成熟度培養, 但也擔心良好的制度會被曲解成只有大型專案適用或者制度無效...的論述.

    我要說明的是

    1. CMMI 本身並不是一套標準作業流程, RUP 才是流程定義, 然而 CMMI 主要是定義流程應該達成的目標 (Goals), 因此, 公司內部可以定義自己的一套流程, 也可以採用類似 RUP 的規範, 但重點是 流程是適合貴公司的, 而且流程可以達到某些 Goals. 這就是為什麼我會建議引進 CMMI 的公司能夠先掌握公司的組織的目標, 並定義出一套能夠滿足組織目標並能夠落實的流程. 不要為了 CMMI 而 CMMI

    2. 小型專案也適用 CMMI, 但流程絕對不跟大型專案相同, 這就是 CMMI 裡頭談到的調適原則 (Tailoring Guide), 會說小型專案不適用的人, 大多數的情況是公司沒有一套所謂的調適原則, 我就見過三個人的專案也採用 CMMI 的規範, 文件不多, 但一樣可以滿足 CMMI 的 Goals , 舉例來說: 用 CVS 管控專案 -> 滿足 Configuration Management, 用 Use Case -> Analysis Model -> Design Model -> Code -> 滿足 Requirement Management, 用 MS-Project 追蹤與報告專案進度 -> 滿足 PP, PMC ... 其實制度是看人如何用它, 掌握制度的精隨不要以偏概全是比較重要的. ISO 也是好的規範, 只是被濫用了

    對筆者來說,CMMI 就像是一本字典或者說是SI產業的百科全書,這書裡充滿了可活用的資訊,分別從工程流程、後勤支援、專案管理、流程管理等四大流程領域闡述其內涵,四大流程領域涵蓋的內容如下:

    1. 工程流程領域 (Engineering Processes),包括了需求管理、需求發展、技術解決方案、產品整合、驗證(Verification)、確認(Validation) 等;對筆者而言工程流程領域就是系統整合或軟體發展公司的價值鏈,如同一間工廠從接單、生產、品管、出貨、收款的過程,算得上是公司的命脈所繫,因此價值鏈必須受到重視,有了良好且穩定的生產作業後,產品品質才會穩定、信譽才能廣佈,之後才能厚實客戶群,從而發展精進,進而提升公司的競爭門檻(這才是能力成熟度的基本意義)。

    2. 後勤支援流程 (Supporting Processes),包括了度量分析、流程與產品品質保證、建構管理、決策分析與解決方案、跨界整合性組織環境、成因分析與解決方案等;後勤支援體系就像作戰一樣,是前線作戰的堅實後盾,這當中包括了情報收集、知識累積與經驗傳承,這些都是組織知識形成的過程。也是中高階領導人應該關注的重點之ㄧ。

    3. 專案管理流程 (Project Management Processes),包括了專案規劃、專案監控、供應商協議管理、風險管理、整合性專案管理、整合性供應商管理、整合性專案團隊、量化專案管理等;整體來看,專案管理流程領域是專案履約過程的整體規劃與管制作業,也是客戶、協力廠商、公司主管及專案團隊的協同合作基礎,履約過程中發生的各種狀況、意見與衝突,都需要妥善地溝通、協調與處置,除了充分履約與達成使命之外,更重要的是團隊成長與經驗分享,這才是專案管理應該滿足的重點。

    4. 流程管理領域 (Processes Management),包括了組織流程焦點、組織流程定義、組織層級教育訓練、組織流程效能、組織創新與落實等;一旦工程流程、後勤支援、專案管理…等落實後,公司便會累積出一些重要的資產,這些資產包括了作業方法、文件樣板、經驗分享與決策過程…,如果這些資產分散各地甚至因人而流失,對公司或者相關同仁而言都是一大損失,因此,我們需要管理這些組織資產,並在這些基礎上不斷改善與創新。