⑴ 台式機使用Linux系統,是一種什麼體驗
上手期
這個階段因為剛剛接觸 Linux,會發現之前使用其它系統的一些經驗在這上面行不通了,因為系統的設計理念不同,所以使用時思維方式也不同,如果思維方式不慢慢轉變過來,會覺得 Linux 真難用,啥啥都沒有,干什麼都不方便,還經常出一些莫名其妙的錯誤,比「請與系統管理員聯系」還讓人抓狂……
這時的用戶像沒頭蒼蠅一樣到處亂撞,靠揣測和感覺尋找出路,程序員都不喜歡無法掌控的東西,所以此時很多一開始滿腔熱情的用戶開始打退堂鼓,最後轉身離去,其中一些人還會用諸如命令難記、GUI 不友好、容易出問題、不能玩游戲等理由勸阻後來者。
我個人很幸運,在同事的幫助下慢慢找到一點感覺,因為當時公司開發全體 Linux,不學會就不用混了 T^T
命令太多難記?記不住就 man,man 啊 man 啊的就記住了。
GUI 不友好,一天 80% 的時間對著代碼要那麼花哨的界面做啥?程序員一生都在編譯啊,省點資源給編譯器吧, Terminal 才是王道。
出問題了?ldd/strace/lsmod/netstat/config.log……辦法總比問題多嘛。
至於游戲嘛我比較好打發,有 steam 就夠了。
就這樣一點點的學習和磨合,慢慢覺得用上手了,重回用 Linux 之前的工作效率(呼~終於不用擔心被開除了……)
融入期
上手之後,對 Linux 的感覺是還行,雖然學起來費點勁兒,但起碼幹活兒夠用了,所以不少人會用兩台機器或者虛擬機,一個幹活一個娛樂。但要達到題主說的「只使用 Linux」,則需要更進一步,體會到 Linux 的優勢然後徹底融入。我的經歷與其說是體會,不如說是刺激。舉個栗子:
當時我發現只有我在用 IDE,其他同事不是 vim 就是 emacs,一開始我覺得大家只是習慣不同,用習慣了都差不多。直到我參與了 CodeReview 和結對編程這類活動之後,才發現不是差不多,而是差太多!原因很簡單,用 IDE 的大多時間有隻手在滑鼠上,鍵盤上只有五根指頭,加上滑鼠上那兩根也才七根,用 vim/emacs 的則是十個指頭全在鍵盤上。首先手速就有差距,再加上 vim/emacs 的編輯方式相當於微操,加成起來差得就不是一星半點了。
類似的栗子還有掛內存檔提高編譯速度、用腳本將各種工作流程自動化等等等等,讓我意識到——差距是全面的,很多東西不是別的系統做不到,而是遠沒有 Linux 支持得簡單直接。找到差距也有了目標,剩下的就是學習了。
在這個階段中,用戶對 Linux 的認識開始深入,慢慢欣賞到 Linux 各個優秀之處,思維方式也逐漸融入進去,隨之工作效率大幅提高,受益之後他們希望讓更多人知道 Linux 的好處(比如我現在回答這個題目)。
⑵ 如何優雅地為程序中的變數和函數命名
簡言之,根據語意來選擇詞彙,別無它法……然而,有時我們會不知用什麼詞彙更合適。
當你想到某個抽象的東西,你更傾向於最先想到的詞語,除非你故意不這樣,這些詞也會搶著出現,直到模糊或改變你的想法。
當你想到一個具體的對象,你覺得詞窮,然後你想描述的已經看到了,然後你繼續尋找更適合它的詞。
哈哈,命名竟成了編程中最難的事~
Martin Fowler曾經在一篇文章中曾經引用過Phil Karlton的話:
There are only two hard things in Computer Science: cache invalidation
and naming things.
他說這句話在很長的一段時間內都是他最喜歡的話。可見命名對於廣大的程序員來說的確是個大問題。
對於我們中國人來說,問題可能出在兩個方面:
– 自打學編程開始就沒被教育過要重視命名。
這可以在譚浩強的《C語言入門》一書中可見一斑。《C語言入門》可以說是很多程序員在大學時學習的第一門編程語言使用的教材。而本書通篇都是各種
a,b,c,x,y,z 的命名方式。這種poor naming的方式被廣大程序員紛紛效仿,導致如今在很多項目代碼中隨處可見。
– 命名需要一定的英文功底,而國內程序員的英文水平參差不齊。
很多程序員被教育後開始逐漸重視命名,但是受限於英文水平,不知道使用什麼合適的英文詞彙來命名。有的甚至直接把中文直譯為英文的方式命名,或者直接用拼音來命名,反而得不償失。
命名的重要性我想不需要過於強調。如今的軟體開發早已不是求伯君那種單槍匹馬的時代。你寫下的每一行代碼都會在不久的以後被團隊的其他人甚至你自己多次查看。如果是個開源項目,那麼更會被全球各地的人查看源代碼。所以代碼的可讀性就變得尤為重要。如果讀者能夠輕松讀出你的代碼的意圖,那麼就說明你的命名功底相當扎實。
比如在一個管理系統中,你使用這樣的代碼: a = b * c
很容易讓人摸不著頭腦,雖然程序能夠正常運作,但恐怕沒人敢輕易修改這行他們不了解的代碼。而如果修改成為這樣: weeklypay =
hours_worked * pay_rate; 那恐怕極少有人不懂這行代碼的意圖。
糟糕的命名也會導致大量無謂的注釋,這是一個很容易跳進去的陷阱。下一段代碼怕別人不明白你的意圖,那麼就加上注釋。這貌似是一個很精妙的想法,實際上卻南轅北轍。比如以下的注釋:
int d; // elapsed time in days
貌似很容易讓人讀懂,但是問題還是很多。首先注釋不能跟著所有的引用,在定義處了解了d的含義,繼續往下看的話卻很容易忘記;其次代碼更新了,很可能會忘記修改注釋,反而給把讀者帶入歧途。
與其用這樣的注釋,還不如直接重命名: int elapsedTimeInDays; 這樣清晰易懂,還不用維護注釋,何樂而不為?
那麼如何著手來提高的自己的命名技巧那?
首先尋找一份公認的代碼規范,並嚴格按照這樣的標准執行。比如google開源了自己內部使用的語言編碼規范,我們可以直接拿來使用。比如請看Google
java的style guide,相當詳實。除此之外還有C++等。這里收集了Google對各種語言的編碼規范,非常具有參考價值。
標準的代碼規范中的每一條都是有勝出的理由,值得我們遵從。但某些命名問題不一定只有一種最好的解決方式,這就需要團隊自己建立起約定。比如對於Java單元測試類的命名方式,不同的團隊可能不一樣。比如有的團隊喜歡以should開頭,有的喜歡test開頭,有的喜歡駱駝命名法,有些喜歡下劃線命名法,每種方式有各自的利弊,沒有一種能完全脫穎而出,所以需要團隊自行制定。一旦確定使用某一種,那麼一定要保持一致。
某些命名規范其實是可以進行自動化檢查的,比如在Java應用的構建過程中可以引用checkStyle這款插件,對命名進行一些基本的檢查,比如方法名、變數名是否遵循了一定模式等。這樣在一定程度上可以強制大家遵守某些約定。自己以前曾經寫過一篇文章,請參見這里。
最後要在團隊中建立起code review的機制,通過code
review來相互監督糾正命名問題,並且這樣更容易達成一致的命名約定,方便協作開發。code
review可以採取非正式會議評審的方式。最簡單的方式就是每天找個固定時間大家一起聚在一個顯示器前review每個人的代碼,現場提出問題,當事人記錄下來會後更改。這種方式非常高效。另外有的團隊在嵌入代碼時可能會引入一些代碼評審機制,比如pull
request, cherry pick等。這種review方式比較重量級,反饋周期也較長,好處是可以保證最終遷入的代碼是沒有問題的。
很多語言和框架為了更加可讀,都把命名玩出花來了。比如JavaScript生態圈中重要的單元測試工具Jasmine把測試函數以it命名,這樣可以與參數連接起來成為一種表意的自然語言:
如何優雅地為程序中的變數和函數命名?
- 不同的代碼段採用不同的命名長度。通常來說,循環計數器(loop
counters)採用1位的單字元來命名,循環判斷變數(condition/loop
variables)採用1個單詞來命名,方法採用1-2個單詞命名,類採用2-3個單詞命名,全局變數採用3-4個單詞命名。
- 對變數採用具體的命名(specific names)方式,」value」, 「equals」,
「data」在任何情況下都不是一種有效的命名方式。
- 採用有意義的命名(meaningful names)。變數的名字必須准確反映它的含義和內容。
- 不要用 o_, obj_, m_ 等前綴命名。變數不需要前綴標簽來表示自己是一個變數。
- 遵循公司的變數命名規則,在項目中堅持使用同一種變數命名方式。例如txtUserName, lblUserName,
cmbSchoolType等,否則會對可讀性造成影響,而且會令查找/替換工具(find/replace tools)不可用。
- 遵循當前語言的變數命名規則,不要不統一(inconsistently)地使用大/小寫字母。例如:userName, UserName,
USER_NAME, m_userName, username, …。
以Java為例:
* 類名使用駝峰命名法(Camel Case):VelocityResponseWriter
* 包名使用小寫:com.company.project.ui
* 變數使用首字母小寫的駝峰命名法(Mixed Case):studentName
* 常量使用大寫:MAX_PARAMETER_COUNT = 100
* 枚舉類(enum class)採用駝峰命名法,枚舉值(enum values)採用大寫。
* 除了常量和枚舉值以外,不要使用下劃線』_』
- 在同一個類不同的場景(contexts)中不要復用變數名。例如在方法、初始化方法和類中。這樣做可以提高可讀性和可維護性。
- 不要對不同使用目的的變數使用同一個變數名,而是賦予它們不同的名字。這同樣對保持可讀性和可維護性很重要。
- 變數名不要使用非ASCII字元(non-ASCII chars)。這樣做可能會在跨平台使用時產生問題。
-
不要使用過長的變數名(例如50個字元)。過長的變數名會導致代碼醜陋(ugly)和難以閱讀(hard-to-read),還可能因為字元限制在某些編譯器上存在兼容性問題。
- 僅使用一種自然語言(natural language)來命名變數。例如,同時使用德語和英語來命名變數會導致(理解)不一致和降低可讀性。
- 使用有意義的方法名。方法名必須准確表達該方法的行為,在多數情況下以動詞(verb)開頭。(例如:createPasswordHash)
- 遵循公司的方法命名規則,在項目中堅持使用同一種方法命名方式。例如 getTxtUserName(), getLblUserName(),
isStudentApproved(),否則會對可讀性造成影響,而且會令查找/替換工具不可用。
- 遵循當前語言的變數命名規則,不要不統一地使用大/小寫字母。例如:getUserName, GetUserName, getusername,
…。
以Java為例:
* 方法使用首字母小寫的駝峰命名法:getStudentSchoolType
* 方法參數使用首字母小寫的駝峰命名法:setSchoolName(String schoolName)
- 使用有意義的方法參數命名,這樣做可以在沒有文檔的情況下盡量做到「自解釋(documentate itself)」
總之,命名問題只是整個編碼規范中的一小部分,但是起的作用舉足輕重,它是判斷一個程序員是否專業的必要標准。
⑶ java開發工具中的代碼管理工具有那些
Code Review中文應該譯作「代碼審查」或是「代碼評審」,這是一個流程,當開發人員寫好代碼後,需要讓別人來review一下他的代碼,這是一種有效發現BUG的方法。由此,我們可以審查代碼的風格、邏輯、思路……,找出問題,以及改進代碼。因為這是代碼剛剛出爐的時候,所以,這也是代碼重構,代碼調整,代碼修改的最佳時候。所以,Code Review是編碼實現中最最重要的一個環節。長時間以來,Code Review需要有一些有效的工具來支持,這樣我們就可以更容易,更有效率地來進行代碼審查工作。下面是5個開源的代碼審查工具,他們可以幫助你更容易地進行這項活動。1. Review board:
Review board 是一個 基於web 的工具,主要設計給 django 和python的用戶。 Review board 可以幫助我們追蹤待決代碼的改動,並可以讓Code-Review更為容易和簡練。盡管Review board 最初被設計在VMware項目中使用,但現在其足夠地通用。當前,其支持這些代碼版本管理軟體: SVN, CVS, Perforce, Git, Bazaar, 和Mercurial.Yahoo 是review-board的其中一個用戶。「Review board 已經改變了代碼評審的方式,其可以強迫高質量的代碼標准和風格,並可以成為程序員編程的指導者。每一次,當你訪問search.yahoo.com 時,其代碼都是使用 Review board工具Review過的。 We』re great fans of your work!」– Yahoo! Web Search 2. Codestriker:
Codestriker 也是一個基於Web的應用,其主要使用 GCI-Perl 腳本支持在線的代碼審查。Codestriker 可以集成於CVS, Subversion, ClearCase, Perforce 和Visual SourceSafe。並有一些插件可以提供支持其它的源碼管理工具。David Sitsky 是 Codestriker 的作者,並也是最活躍的開發人員之一。 Jason Remillard 是另一個活路的開發者,並給這個項目提供了最深遠最有意義的貢獻。大量的程序員貢獻他們的代碼給 Codestriker 項目,導致了這個項目空前的繁榮。 3. Groogle:
Groogle 是一個基於WEB的代碼評審工具。 Groogle 支持和 Subversion 集成。它主要提供如下的功能:各式各樣語言的語法高亮。
支持整個版本樹的比較。
支持當個文件不同版本的diff功能,並有一個圖形的版本樹。
郵件通知所有的Reivew的人當前的狀態。
認證機制。 4. Rietveld:
Rietveld 由Guido van Rossum 開發(他是Python的創造者,現在是Google的員工),這個工具是基於Mondrian 工具,作者一開始是為了Google 開發的,並且,它在很多方面和Review board 很像。它也是一個基於Web的應用,並可以Google App Engine 當主機。它使用了目前最流行的Web開發框架 django 並支持 Subversion 。當前,任何一個使用 Google Code 的項目都可以使用 Rietveld 並且使用 python Subversion 伺服器。當然,它同樣支持其它的Subversion伺服器。 5. JCR
JCR 或者叫做 JCodeReview 也是一個基於WEB界面的最初設計給Reivew Java 語言的一個工具。當然,現在,它可以被用於其它的非Java的代碼。JCR 主要想協助:審查者。所有的代碼更改都會被高亮,以及大多數語言的語法高亮。Code extracts 可以顯示代碼評審意見。如果你正在Review Java的代碼,你可以點擊代碼中的類名來查看相關的類的聲明。
項目所有者。可以 輕松創建並配置需要Review的項目,並不需要集成任何的軟體配置管理系統(SCM)。
流程信仰者。 所有的評語都會被記錄在資料庫中,並且會有狀態報告,以及各種各樣的統計。
架構師和開發者。 這個系統也可以讓我們查看屬於單個文件的評語,這樣有利於我們重構代碼。
⑷ 在大家眼中,程序員是一個怎樣的職業
為什麼有人在技術造神
大家應該已經感受到,技術圈這兩年已經和娛樂圈創業圈差不多的氛圍了,這其實是有原因的。
最主要的原因是,創業公司和創業媒體越來越多,他們需要大量的程序員投身到創業這個高風險的行業中,而造神,正是讓程序員們自動跳進火坑的絕佳辦法。不是說程序員不能創業,我是說,創業媒體們故意模糊了創造和創業的界限,把程序員們的創造沖動偷換概念,鼓吹了太多不適合的人去創業。
另一個原因是,招聘成本高漲,CTO 們為了能提升影響力,不得不頻頻出席各種大會刷臉。文筆好的再做做自媒體和技術社群,既能強化個人品牌提高身價,又能在融資的時候提升成功率。
總之,這個行業出現了各種技術大神。
這些大神在普通人類和初級程序員眼裡是無所不能的,是他們嚮往的目標;在中級程序員和高級程序員眼裡,這些大神就是他自己,只不過他還沒紅起來而已…
於是攀比心理也開始泛濫,全國第三的架構師比比皆是,整個圈子漸漸就浮躁起來。
然而絕大部分程序員,依然是雇員
媒體們在包裝時,最喜歡按獨立開發者的路線來整。「從小就對技術有天分」、「大學時曾在某編程大賽一鳴驚人」、「寫了個 APP 玩結果一個月有了千萬用戶」、「從公司離職自立門戶三年上市」。
OK,這的確是程序員的一條職業路線圖。但是媒體們不願意告訴你的是,一:只有極少數程序員是通過這個路線成功的;二:這條線其實需要太多非程序員職位的技能,比如產品設計能力和銷售能力。
程序員的價值決定
絕大部分互聯網公司的程序員職位,沒有技術門檻
然而不幸的是,絕大部分互聯網公司都不是技術驅動的公司。真的就是鳥哥說的那樣,絕大部分技術崗位,其實技術門檻都不高(門檻在工程上,後文細講)。技術不過是這些公司的護航艦,而不是破冰船。
先別打我,冷靜下來想想,到底有多少你會的那些技術,是你的同行們不會的呢?不多,對吧?
幾年前億級別的搜索還是問題,現在已經到處是通用解決方案了;幾年前千萬到億級別的網站和 APP 解決方案還在大公司手裡,現在各個架構大會都講爛啦,而且其實都差不多;就連 DeepLearning,帶 API 介面的框架也開始涌現,只需要把圖片用 REST 傳進去就能取到結果了。
很多事情,已經沒有難度,只需要持續投入。是的,對絕大部分程序員來講,他們不需要成為科學家,而需要成為工程師,成為從科學家手裡接過火種,去燎原大地的人。
怎樣才是一個好工程師
工程的本質不是創造,而是去風險化。
工程是關於如何低成本、高效率、按時按量完成既定任務的。所以判斷一個工程師是否優秀,並不是他多有創意多有名氣,而是看他有多穩,看他能多 GettingThingsDone,中文就是「靠譜」。
有時候一個好的解決方案,未必採用了最新的技術和框架,而是看上去朴實無華,功力都包涵在背後的細節里。就像頂尖高手打的斯洛克檯球,每一桿都平淡無奇,只是因為上一桿的回球太到位。
有同學問,那我工程做的太好,豈不是沒有機會遇到一些高難度挑戰了么?放心,一般公司都僱傭了產品經理來幫你製造高危事件。
同樣的,一個好的工程師,會選擇最適合需求和團隊的方案,考慮開發效率和系統效率的均衡,從而已達到最優效果;而不是整天和別人去爭論什麼語言最好、哪些框架過時了。
工程的另一個要求是進度控制和質量控制。
在項目立項之後動工之前,對要做的事項作出詳盡的規劃,對未來一到兩周的工作給出細致的排期,這是進度控制的基礎。
代碼的及時入庫與合並,自動化測試和每日構建,CodeReview 和文檔編寫,這些看似無關緊要的習慣則決定了項目質量。
不幸的是,很多程序員把這些工程上至關重要的東西當成垃圾,視為對他們「創造力」的壓抑。
他們總是以創造力為借口去尋求自身的自在,比如上班不帶胸牌不打卡,中午休息時間在公司看視頻打游戲,最好可以遠程上班,項目到期之前再來檢查進度,公司不要用統一框架,只有傻逼才寫文檔。
對職業的理解偏差和工程能力上的荒蕪,培養了大批能寫代碼但死活寫不好代碼的「碼農」,反而讓那些有著彪悍工程能力和良好習慣的程序員變得奇貨可居。
最後,來說說程序員那無處安放的創造力
有了錘子想找釘子是很正常的原始沖動,但我們必須認識到,創造力對於程序員這個職業來講,是錦上添花的東西。如果你沒有強大的工程能力,那麼創造力也不過是無本之木。所以扎扎實實的把工程基礎打好,這是最根本的。
在此基礎上,我比較推薦程序員採用內外兩條線來培養自己。在公司內的項目上採取相對保守的策略,盡力把穩定性做到最好,培養出自己卓越的工程能力;然後在公司外的開源項目和自己的獨立項目上,採用一些新的技術、實踐一些新的想法、充分發揮自己的創造力,夢想還是要有的,對吧。
這樣做最明顯的好處是,你可以了解到新技術和激進方案的優缺點,從而在進行方案選型時,有更多的依據;還有一個職業發展上的好處:如果不是主負責人,公司的項目往往不能代表你的能力;但獨立項目卻可以作為一個非常好的能力證明出現在你的簡歷里邊。
你可以是一個身懷絕技的手藝人,在自己家裡你嘗試各種手法各種風格的個人作品;但當你參與頤和園這種級別的工程時,好好的把自己負責的石頭雕成總設計師要求的樣子就好 —— 畢竟這個時代一個人已經很難負責整個項目了。這就是我所理解的程序員的工匠精神。
⑸ 作為一個程序員,有哪些職業自我修養呢
保持對代碼的熱情,持續學習
從現實工作的角度考慮,這可能不是最重要的一條,畢竟持續學習這類話,已經老生常談到快厭煩的地步了。比起學習,可能在每個寫過的類裡面加上你的注釋,甚至包括姓名還有聯系方法更實用些。但我想說的是,保持對本行業持續熱情,並不斷學習,應該是每個從業者最基本的素養,而對於程序員來講,就是保持對代碼的熱情。
當然,這里的保持熱情、不斷學習,並不是一句空話,而是要真正做到的。從長遠角度講,只有不斷提升自己的專業技能,才能更好的應付將來對本職工作提出的新的要求。同時,對於自己來講,也只有不斷學習,才能讓自己時刻保持出色的競爭力。
養成良好的工作習慣
從編程本身來講,盡量寫出邏輯嚴密的代碼,多寫注釋,少留bug,不要給後人挖坑,經常做代碼評審(code review)和代碼重構(code refactoring)。一個好的編程習慣可以提高效率、減少重復工作等等。從職場溝通角度來講,養成即時反饋,定時匯報的工作習慣,可以避免因為溝通不暢導致多走許多彎路。
因此,對於一個程序員來講,養成一個良好的工作習慣,也因該是作為一個程序員的基本自我職業修養。(高中上完想學電腦編程,電腦編程培訓多少錢)
及時調整心態的能力
大多數程序員的工作,都是項目制的。在項目期間,996甚至007都是常態,因此可能會有比較大的壓力。同時,在項目實施過程中,遇到挫折也要及時調整心態重整旗鼓。所以,作為一名碼農,也要有及時調整心態的能力。
⑹ 如何開發軟體
60年代中期開始爆發了眾所周知的軟體危機。為了克服這一危機,在1968、1969年連續召開的兩次著名的NATO會議上提出了軟體工程這一術語,並在以後不斷發展、完善。與此同時,軟體研究人員也在不斷探索新的軟體開發方法。至今已形成八類軟體開發方法。
一、1972年 Parnas方法
二、1978年 SASA方法
三、1975年 面向數據結構的軟體開發方法(至今仍廣泛使用)
四、問題分析法
五、面向對象的軟體開發方法
六、可視化開發方法
一、Parnas方法
最早的軟體開發方法是由D.Parnas在1972年提出的。由於當時軟體在可維護性和可靠性方面存在著嚴重問題,因此Parnas提出的方法是針對這兩個問題的。首先,Parnas提出了信息隱蔽原則:在概要設計時列出將來可能發生變化的因素,並在模塊劃分時將這些因素放到個別模塊的內部。這樣,在將來由於這些因素變化而需修改軟體時,只需修改這些個別的模塊,其它模塊不受影響。信息隱蔽技術不僅提高了軟體的可維護性,而且也避免了錯誤的蔓延,改善了軟體的可靠性。現在信息隱蔽原則已成為軟體工程學中的一條重要原則。
Parnas提出的第二條原則是在軟體設計時應對可能發生的種種意外故障採取措施。軟體是很脆弱的,很可能因為一個微小的錯誤而引發嚴重的事故,所以必須加強防範。如在分配使用設備前,應該取設備狀態字,檢查設備是否正常。此外,模塊之間也要加強檢查,防止錯誤蔓延。
Parnas對軟體開發提出了深刻的見解。遺憾的是,他沒有給出明確的工作流程。所以這一方法不能獨立使用,只能作為其它方法的補充。
二、SASA方法
1978年,E.Yourdon和L.L.Constantine提出了結構化方法,即SASD方法,也可稱為面向功能的軟體開發方法或面向數據流的軟體開發方法。1979年TomDeMarco對此方法作了進一步的完善。
Yourdon方法是80年代使用最廣泛的軟體開發方法。它首先用結構化分析(SA)對軟體進行需求分析,然後用結構化設計(SD)方法進行總體設計,最後是結構化編程(SP)。這一方法不僅開發步驟明確,SA、SD、SP相輔相成,一氣呵成,而且給出了兩類典型的軟體結構(變換型和事務型),便於參照,使軟體開發的成功率大大提高,從而深受軟體開發人員的青睞。
三、面向數據結構的軟體開發方法
Jackson方法
1975年,M.A.Jackson提出了一類至今仍廣泛使用的軟體開發方法。這一方法從目標系統的輸入、輸出數據結構入手,導出程序框架結構,再補充其它細節,就可得到完整的程序結構圖。這一方法對輸入、輸出數據結構明確的中小型系統特別有效,如商業應用中的文件表格處理。該方法也可與其它方法結合,用於模塊的詳細設計。
Jackson方法有時也稱為面向數據結構的軟體設計方法。
Warnier方法
1974年,J.D.Warnier提出的軟體開發方法與Jackson方法類似。
差別有三點:一是它們使用的圖形工具不同,分別使用Warnier圖和Jackson圖;另一個差別是使用的偽碼不同;最主要的差別是在構造程序框架時,Warnier方法僅考慮輸入數據結構,而Jackson方法不僅考慮輸入數據結構,而且還考慮輸出數據結構。
四、問題分析法
PAM問題分析法。PAM(ProblemAnalysisMethod)是80年代末由日立公司提出的一種軟體開發方法。
PAM方法希望能兼顧Yourdon方法、Jackson方法和自底向上的軟體開發方法的優點,而避免它們的缺陷。它的基本思想是:考慮到輸入、輸出數據結構,指導系統的分解,在系統分析指導下逐步綜合。這一方法的具體步驟是:從輸入、輸出數據結構導出基本處理框;分析這些處理框之間的先後關系;按先後關系逐步綜合處理框,直到畫出整個系統的PAD圖。從上述步驟中可以看出,這一方法本質上是綜合的自底向上的方法,但在逐步綜合之前已進行了有目的的分解,這個目的就是充分考慮系統的輸入、輸出數據結構。
PAM方法的另一個優點是使用PAD圖。這是一種二維樹形結構圖,是到目前為止最好的詳細設計表示方法之一,遠遠優於NS圖和PDL語言。
這一方法在日本較為流行,軟體開發的成功率也很高。由於在輸入、輸出數據結構與整個系統之間同樣存在著鴻溝,這一方法仍只適用於中小型問題。
五、面向對象的軟體開發方法
面向對象技術是軟體技術的一次革命,在軟體開發史上具有里程碑的意義。
隨著OOP(面向對象編程)向OOD(面向對象設計)和OOA(面向對象分析)的發展,最終形成面向對象的軟體開發方法OMT(LbjectModellingTechnique)。這是一種自底向上和自頂向下相結合的方法,而且它以對象建模為基礎,從而不僅考慮了輸入、輸出數據結構,實際上也包含了所有對象的數據結構。所以OMT徹底實現了PAM沒有完全實現的目標。不僅如此,OO技術在需求分析、可維護性和可靠性這三個軟體開發的關鍵環節和質量指標上有了實質性的突破,徹底地解決了在這些方面存在的嚴重問題,從而宣告了軟體危機末日的來臨。
自底向上的歸納
OMT的第一步是從問題的陳述入手,構造系統模型。從真實系統導出類的體系,即對象模型包括類的屬性,與子類、父類的繼承關系,以及類之間的關聯。類是具有相似屬性和行為的一組具體實例(客觀對象)的抽象,父類是若乾子類的歸納。因此這是一種自底向上的歸納過程。在自底向上的歸納過程中,為使子類能更合理地繼承父類的屬性和行為,可能需要自頂向下的修改,從而使整個類體系更加合理。由於這種類體系的構造是從具體到抽象,再從抽象到具體,符合人類的思維規律,因此能更快、更方便地完成任務。這與自頂向下的Yourdon方法構成鮮明的對照。在Yourdon方法中構造系統模型是最困難的一步,因為自頂向下的「頂」是一個空中樓閣,缺乏堅實的基礎,而且功能分解有相當大的任意性,因此需要開發人員有豐富的軟體開發經驗。而在OMT中這一工作可由一般開發人員較快地完成。在對象模型建立後,很容易在這一基礎上再導出動態模型和功能模型。這三個模型一起構成要求解的系統模型。
自頂向下的分解
系統模型建立後的工作就是分解。與Yourdon方法按功能分解不同,在OMT中通常按服務(Service)來分解。服務是具有共同目標的相關功能的集合,如I/O處理、圖形處理等。這一步的分解通常很明確,而這些子系統的進一步分解因有較具體的系統模型為依據,也相對容易。所以OMT也具有自頂向下方法的優點,即能有效地控制模塊的復雜性,同時避免了Yourdon方法中功能分解的困難和不確定性。
OMT的基礎是對象模型
每個對象類由數據結構(屬性)和操作(行為)組成,有關的所有數據結構(包括輸入、輸出數據結構)都成了軟體開發的依據。因此Jackson方法和PAM中輸入、輸出數據結構與整個系統之間的鴻溝在OMT中不再存在。OMT不僅具有Jackson方法和PAM的優點,而且可以應用於大型系統。更重要的是,在Jackson方法和PAM方法中,當它們的出發點輸入、輸出數據結構(即系統的邊界)發生變化時,整個軟體必須推倒重來。但在OMT中系統邊界的改變只是增加或減少一些對象而已,整個系統改動極小。
需求分析徹底
需求分析不徹底是軟體失敗的主要原因之一。即使在目前,這一危險依然存在。傳統的軟體開發方法不允許在開發過程中用戶的需求發生變化,從而導致種種問題。正是由於這一原因,人們提出了原型化方法,推出探索原型、實驗原型和進化原型,積極鼓勵用戶改進需求。在每次改進需求後又形成新的進化原型供用戶試用,直到用戶基本滿意,大大提高了軟體的成功率。但是它要求軟體開發人員能迅速生成這些原型,這就要求有自動生成代碼的工具的支持。
OMT徹底解決了這一問題。因為需求分析過程已與系統模型的形成過程一致,開發人員與用戶的討論是從用戶熟悉的具體實例(實體)開始的。開發人員必須搞清現實系統才能導出系統模型,這就使用戶與開發人員之間有了共同的語言,避免了傳統需求分析中可能產生的種種問題。
可維護性大大改善
在OMT之前的軟體開發方法都是基於功能分解的。盡管軟體工程學在可維護方面作出了極大的努力,使軟體的可維護性有較大的改進。但從本質上講,基於功能分解的軟體是不易維護的。因為功能一旦有變化都會使開發的軟體系統產生較大的變化,甚至推倒重來。更嚴重的是,在這種軟體系統中,修改是困難的。由於種種原因,即使是微小的修改也可能引入新的錯誤。所以傳統開發方法很可能會引起軟體成本增長失控、軟體質量得不到保證等一系列嚴重問題。正是OMT才使軟體的可維護性有了質的改善。
OMT的基礎是目標系統的對象模型,而不是功能的分解。功能是對象的使用,它依賴於應用的細節,並在開發過程中不斷變化。由於對象是客觀存在的,因此當需求變化時對象的性質要比對象的使用更為穩定,從而使建立在對象結構上的軟體系統也更為穩定。
更重要的是OMT徹底解決了軟體的可維護性。在OO語言中,子類不僅可以繼承父類的屬性和行為,而且也可以重載父類的某個行為(虛函數)。利用這一特點,我們可以方便地進行功能修改:引入某類的一個子類,對要修改的一些行為(即虛函數或虛方法)進行重載,也就是對它們重新定義。由於不再在原來的程序模塊中引入修改,所以徹底解決了軟體的可修改性,從而也徹底解決了軟體的可維護性。OO技術還提高了軟體的可靠性和健壯性。
六、可視化開發方法
可視化開發是90年代軟體界最大的兩個熱點之一。隨著圖形用戶界面的興起,用戶界面在軟體系統中所佔的比例也越來越大,有的甚至高達60~70%。產生這一問題的原因是圖形
界面元素的生成很不方便。為此Windows提供了應用程序設計介面API(Application Programming Interface),它包含了600多個函數,極大地方便了圖形用戶界面的開發。但是在這批函數中,大量的函數參數和使用數量更多的有關常量,使基於Windows API的開發變得相當困難。為此Borland C++推出了Object Windows編程。它將API的各部分用對象類進行封裝,提供了大量預定義的類,並為這些定義了許多成員函數。利用子類對父類的繼承性,以及實例對類的函數的引用,應用程序的開發可以省卻大量類的定義,省卻大量成員函數的定義或只需作少量修改以定義子類。
Object Windows還提供了許多標準的預設處理,大大減少了應用程序開發的工作量。但要掌握它們,對非專業人員來說仍是一個沉重的負擔。為此人們利用Windows API或Borland C++的Object Windows開發了一批可視開發工具。
可視化開發就是在可視開發工具提供的圖形用戶界面上,通過操作界面元素,諸如菜單、按鈕、對話框、編輯框、單選框、復選框、列表框和滾動條等,由可視開發工具自動生成應用軟體。
這類應用軟體的工作方式是事件驅動。對每一事件,由系統產生相應的消息,再傳遞給相應的消息響應函數。這些消息響應函數是由可視開發工具在生成軟體時自動裝入的