系統開發 III

系統開發 part III

人員配置

假定這是一個稍微大一點的軟體系統,當然,你現在看到的只是小小的系統程式而已,由小才能變大,小樹苗最後也會變成大樹的啦。

假定你是專案負責人,現在要先做好專案計畫,好跟老大申請要人。我們來看看需求人力及GANTT圖表。

  • [x] meet with boss
  • [x] send sms to colleagues
  • [ ] date my gantt meeting
  • [ ] write reporting to team leaders

人員配置

以下對這5個人用簡稱命名。阿貝打字很辛苦的啦。 所以PM(ProjMgr)要分配工作給這五個人(PC…PT),接著就是 “喬工作” 的時候來了。

好了,分配完成,以後還是會有變動的,比較龜毛還加上PERT,阿貝你是怎麼分析GANTT圖?

The Answer is “I don’t know”, 開玩笑的啦,經驗而已。

我的習慣是先做好溝通介面 I/O 的分析,預估時間,以最接近資料溝通 ( data transcation ) 的函數 (功能,程式) 為起始點,類似大家講的 UML ,以上面的範例,我們以 JAVA 來說,也就是 package 的制定。上圖 meeting 就是在做 輸出入的溝通統合,定義好了介面溝通的方式你才可以進行下一步。 而產品經理也應該準備好 obd 的 device 硬體了。

下一步才是開始做各個 package 裡面的 classes。 建置每個 class (java file)時,就可以開始同步進行寫程式。我的經驗裡,訓練程式設計人員,要程式設計人員寫程式時只要負責他的區塊 (block),也就是 PO 人員在寫他的 obd classes 時,只要專注他如何跟 device 溝通,資料間的參數互傳只限定在他自己的package裡面。看得懂嗎?你可以試試寫程式時,亂 CALL 函數一通,就知道答案了。不然,你以為建立 test 目錄給 JUNIT 是做辛酸的嗎?你有沒有發現跟 MVC (Model View Controller)有點像。

PO & PP (model)

PC & PT (text View)

PG (gui)

MiTronics (master controller)

Java maven 的這些建立法則,阿貝以前就看過,只是隨著 open source 的大量開放,大家得以獲得,不然永遠都躲在某些公司的角落裡孤芳自賞。

我們以前寫程式,因為受限檔案名稱最多只能8個英文字,還用數字+英文做代碼成為檔名,內容才有真正的檔案用途註解,找資料時只能用 grep 這類的方式找,喔,有點久遠。

├── a.prg
├── a0.prg
|   ├── a00.prg
|   └── a01.prg
├── a1.prg
|   ├── a10.prg
|   └── a11.prg
├── a2.prg
|   ├── a20.prg
|   |  ......
|   └── a2z.prg
|
├── ......
|
├── aa.prg
|   ├── aa0.prg
|   └── aa1.prg
├── zz.prg
|   └── zz0.prg
├── b.dat
└── c.dat

好啦,還剩下,就是不太重要,可是很多人認為很重要的東西,程式篇。

我覺得寫程式是練兵,阿貝最討厭的不是程式,而是建制 IDE 跟 debug,尤其是 Java,當年號稱小而美,現在像是巨型怪獸,好比一個 1 + 1 = 2,你就要加上一堆 try{} catch{} throw {} exception {} ……,所以 node.js(java script), python, ruby, , , balabala,才會有另外的人想去學。這樣也好。當年的靠伯 (Cobol) 老太太裹腳布一樣 及 浮船(fortran) 一堆符號數字 也是一堆人在必學的課程。不是嗎?


這是一個叫 processing 的程式,我把不重要的都拿掉,PS: 我沒學過。 真心不騙。全地球有上千萬的程式語言及系統,我不是萬能的。

void draw() {
  while (myPort.available()>0){
    int inByte = myPort.read();   
    delay(50);

    if  (inByte != 0x0D)
    {
          Command = Command + char(inByte);      
    }
    else
    {
          println(Command);
          String Color = Command.substring(0, 1);
          if (Color.equals ("A") == true)
          {
              String A_Value_Str = Command.substring(1,4);
              aa = Integer.parseInt(A_Value_Str); 
              println("A:"+A_Value_Str);

          }
          else if (Color.equals ("B") == true)
          {
              String B_Value_Str = Command.substring(1,4);
              bb = Integer.parseInt(B_Value_Str);
              println("B:"+B_Value_Str);
          }
          else if (Color.equals ("C") == true)
          {
              String C_Value_Str = Command.substring(1,4);
              cc = Integer.parseInt(C_Value_Str);
              println("C:"+C_Value_Str);
          }
          Command = "";
    }
  }

我改成下面,PS: 我沒裝IDE環境,只有 VIM editor 及 Google。

int lf = 10;
String myString = null;

void drawLoop()
{
  while (myPort.available() > 0) {
    myString = myPort.readStringUntil(lf);
    if (myString != null) {
      delay(50);
      draw();
    } else {
      println("data expected!");
    }
  }
}

void draw() 
{
  int digi = 0;
  String number = "0";
  int length = myString.length();

  if (length > 1) {
    number = myString.substring(1,length-1);
    digi = Integer.parseInt(number);
  }

  myString = myString.substring(0, 1);
  myString = myString.toUpperCase();

  if (myString.equals("A")==true) {
    aa = digi;
    println("A:"+number); 
  } else if (myString.equals("C") == true) {
    cc = digi;
    println("C:"+number);
  } else if (myString.equals("B") == true) {
    bb = digi;
    println("B:"+number);
  }

待續….

留言

這個網誌中的熱門文章

機車頭燈自動開關裝置

CRV 變速箱油-煞車油-濾芯-中型保養(二)

迅光化油器調整