系統開發 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);
}
待續….


留言
張貼留言