軟工實踐寒假作業(2/2)


軟工實踐寒假作業(2/2)

這個作業屬於哪個課程 2021春軟件工程實踐S班
這個作業要求在哪里 軟工實踐寒假作業(2/2)
這個作業的目標 1.對《構建之法》有更深的理解
2.學習使用git以及github,指定屬於自己的代碼規范
作業正文 作業正文
其他參考文獻 《閱讀之法》

目錄

《構建之法》的深入提問

Q1:
文字引用 王村的程序員果凍邀請鄰村的姑娘小麗去聽音樂會,但是果凍卻遲到了,針對不同的層次,小麗會給出不同的反饋。
最外層:行為和結果 果凍你遲到了,讓我很着急,我們現在進不了會場,錯過了精彩的第一幕表演。
中間層:習慣和動機 果凍你又放我鴿子,你總是不重視我,讓我等在外面,讓我丟人!
最內層:本質和固有屬性 果凍 你太自私了,心理都沒有別人!你們男人沒有一個好東西!
提出問題 雖然這個例子很生動形象地解釋了評價別人的三種層次,但如果面對多樣化反饋應該怎么處理呢?
比如我在玩的一種游戲會定期返廠一些限時物品,但當返廠物品很丑時,大多數玩家會表示不滿.
他們的反饋很簡單,就是想要好看的。當然也有喜歡這些物品的玩家,那我應該怎么根據這些反饋調整我的返廠計划呢
引用說法 在技術團隊中,我們的反饋還是要着重於行為和結果,不要貿然深入到習慣和動機、本質。
除非情況非常嚴峻,需要觸動別人內心深處,讓別人懸崖勒馬。
所得經驗 可以從多個層次分析反饋,通過對反饋的分析改進
Q2:
文字引用 三明治有兩塊面包一塊肉。
在表達觀點時,先使用第一片面包:強調雙方的共同點。團隊共同的願景,讓對方處於一個安全的環境。
接着把建設性的意見加工成肉片:強調過去你做的不夠,不過以后可以做的更好。
最后再來一片面包,呼應開頭,鼓勵對方把工作做好。
提出問題 三明治反饋法是向別人反饋,表達自己的觀點,但我對這個方法的理解是,
它應該用於上級對下級,或者合作伙伴之間的方法,我想知道我的理解是否正確
引用說法
所得經驗 可以在與同學,同事之間使用這種反饋方法,即不失禮又能起到很好的反饋效果。
Q3:
文字引用 初級軟件工程師如何成長?
1、積累軟件開發相關知識,提升技術技能(如對具體技術的掌握,動手能力)。
如:Java、C/C++、診斷/提高效能的技術,對某一開發平台的掌握等。
2、積累問題領域的知識和經驗(例如:對游戲、醫療或金融行業的了解)
提出問題 第2點我不是很理解,這個的意思是需要多了解這些行業中的一些與軟件相關的知識嗎,
但這不是應該取決於我的工作方向嗎,確定了工作方向我才能更多的去了解相關行業
引用說法
所得經驗 其他的建議相當有效,當然這需要在不斷的學習和實踐中成長
Q4:
文字引用 現在明白了需要有職業道德和職業規划,但是不知道具體該如何進行規划呢?
1、考級之路(計算機職業資格認證考試和計算機程序設計能力考試)
2、大公司會為軟件工程師的職業發展提供完備的規划和支持,參照着給自己制定計划即可。
3、鄒欣老師也總結了一些好工程師的自我評價清單,可以根據這個清單進行自我評價,及時補充提高。
提出問題 有沒有轉行的選項,目前在我的理解中,軟件工程師其實工作壓力很大,我不確定等三十五歲之后還會不會選擇這個行業,我只能在過程中選擇是否考級等,選擇是否放棄,這么想會不會太沒有斗志了
引用說法
所得經驗 會根據自我評價清單考慮未來發展方向
Q5:
文字引用 通過不斷的練習,把低層次的問題都解決了,變成不用經過大腦的自動操作,然后才有時間和腦力解決較高層次的問題。
提出問題 還是不太理解層次的划分,但相信通過之后的學習可以理解
引用說法
所得經驗

WordCount編程

Github項目地址

點擊進入

PSP表格
PSP2.1 Personal Software Process Stages 預估耗時(分鍾) 實際耗時(分鍾)
Planning 計划
• Estimate • 估計這個任務需要多少時間 5 5
Development 開發
• Analysis • 需求分析 (包括學習新技術) 120 100
• Design Spec • 生成設計文檔 10 20
• Design Review • 設計復審 10 15
• Coding Standard • 代碼規范 (為目前的開發制定合適的規范) 30 30
• Design • 具體設計 100 110
• Coding • 具體編碼 300 400
• Code Review • 代碼復審 40 60
• Test • 測試(自我測試,修改代碼,提交修改) 60 90
Reporting 報告
• Test Repor • 測試報告 15 30
• Size Measurement • 計算工作量 20 30
• Postmortem & Process Improvement Plan • 事后總結, 並提出過程改進計划 30 40
合計 740 930
解題思路描述
  1. 了解所需要掌握的新知識
  • github desktop的下載和學習使用
  • fork項目
  • commit
  • Pull Request
  1. 分析基本需求
  • 輸入
    • 輸入文件和輸出文件以命令行參數傳入。
  • 統計文件的字符數(對應輸出第一行)
    • 只需要統計Ascii碼,漢字不需考慮
    • 空格,水平制表符,換行符,均算字符
  • 統計文件的單詞總數(對應輸出第二行)
    • 至少以4個英文字母開頭,跟上字母數字符號,單詞以分隔符分割,不區分大小寫。
  • 統計文件的有效行數(對應輸出第三行)
    • 任何包含非空白字符的行,都需要統計。
  • 統計文件中各單詞的出現次數(對應輸出接下來10行)
    • 最終只輸出頻率最高的10個。
    • 頻率相同的單詞,優先輸出字典序靠前的單詞。
    • 輸出的單詞統一為小寫格式
  • 統計結果輸出到output.txt
    • 換行使用'\n',編碼統一使用UTF-8。
    characters: number
    words: number
    lines: number
    word1: number
    word2: number
    ...
  1. 定義函數方法
    輸出字符數:void countChar(String fileName)
    輸出單詞數:void countWord(String fileName)
    輸出有效行數:void countLine(String fileName)
    輸出最多的10個單詞及其詞頻: void countWordFrequency(String fileName)
代碼規范制定鏈接

點擊進入

設計與實現過程
  1. 實現功能統計字符
    一開始在判斷漢字時候糾結了很久,后面閱讀作業要求發現,輸入文件皆為ASCII字碼,只需要返回文件字符數就行。
  2. 實現功能空白行計數
    在讀取行時進行不為空判斷,不為空行數加一
        //readLine()方法, 用於讀取一行,只要讀取內容不為空就一直執行   
        while ((str = in.readLine())!= null) 
        {	
        	//每行字符數相加
        	count_char += str.length();  
        	//當不為空行時,行數加一
        	if(!str.matches(regxSpace))
        		count_line++;
  1. 實現功能單詞數
  • 先完成了空格分隔,在對分隔后的單詞通過正則進行判斷是否為四個字母開頭
  • 判斷為單詞后,用map對單詞數進行統計
  • 實現hashmap的不區分大小寫統計
        //統計單詞數並統計單詞出現次數
        String[]ss = str.split("\\s+|\\W");//表示空格、空行或者非數字字母的正則進行分隔
        for(String s:ss)
	{
        	if(s.matches("[a-z,A-Z]{4,}.*")) //判斷分割后的字符串是否是四個字母開頭的單詞
        	{//map統計這些單詞
	       		if(map.containsKey(s.toLowerCase()))  //toLowerCase忽視大小寫      			
				map.put(s.toLowerCase(), map.get(s.toLowerCase())+1);
			else
				map.put(s.toLowerCase(), 1);
        	}
	}
  • 實現hashmap的優先value排序,value相同時按key字母排序
  • 實現詞頻最大的十個單詞的輸出
        List<String> result = new ArrayList<>();
        List<Map.Entry<String,Integer>> list = new ArrayList<>();
        list.addAll(map.entrySet());
        Collections.sort(list,new Comparator<Map.Entry<String,Integer>>()
        {	//對兩個value進行比較
        	public int compare(Map.Entry<String,Integer>e1,Map.Entry<String,Integer>e2)
        	{
                int re = e2.getValue().compareTo(e1.getValue());
                if(re!=0)
                	return re;
                else
                	return e1.getKey().compareTo(e2.getKey());
            }
        });
        //將比較后的結構加入result中
        for(int i=0;i<map.size();i++)
            result.add(list.get(i).getKey());
  1. 輸出
    讓以上輸出按格式輸出
        //將所有所需數據輸出到文件中
        File file = new File("C:\\Users\\ling\\Desktop\\1.txt");		
	try (PrintWriter output = new PrintWriter(file);) {
		output.println("characters:"+count_char);
		output.println("words:"+count_word);
		output.println("line:"+count_line);
		for(int i=0;i<count_Word_Frequency;i++)
			output.println(list.get(i).getKey()+":"+list.get(i).getValue());
	}
  1. 規范
    將代碼規整划分,並進行完整注釋
性能改進

本來將統計功能分為字符、行數、單詞數、詞頻等四個函數,但發現分開之后需要進行參數傳遞和文件重新讀入,更繁瑣且浪費時間。
改進后將詞頻列為單獨函數容易修改,其他功能不分開節約時間。

單元測試

異常處理說明

在hashmap根據值排序時,List<Entry<String,Integer>>報錯,在多次百度求助並嘗試后,發現Entry需要添加為Map.Entry。

        List<String> result = new ArrayList<>();
        List<Map.Entry<String,Integer>> list = new ArrayList<>();
        list.addAll(map.entrySet());
心路歷程與收獲

教訓是開始的太晚,沒有在作業一布置就開始准備,而是一拖再拖,導致作業的完成相當倉促。過程中遇到的問題也不少,好在可以通過百度和不斷嘗試中解決問題。
之前有學過git和GitHub的使用,但是沒有用過GitHub desktop,使用感覺很好,這讓我意識到我應該多去了解一些實用的代碼工具。盡管不一定會用到,但當需要使用時,好的工具將會節約大量時間,避免因為工具問題耽誤作業工作學習的完成。
這次作業因為想修改單元測試,所以沒有及時提交,因小失大,但遲交是我不可推卸的責任。所以我只能調整心態,在遲交的期限里盡量完善我的作業,多拿幾分是幾分。這次遲交完全是我自己的責任,后悔肯定是有的,但我盡量不沉迷於懊悔的情緒中,要為自己的行為買單,且盡可能地補救。當然,有了這次教訓,我會在之后的作業中認真完成,不拖延,用心對待。
同時因為這次作業,對map的使用有了更深的了解,尤其是學習到了優先根據值排序,再對值相同按照key字母排序。當然還有其它一些之前沒有完全掌握的知識,也在這次作業中鞏固了。
實踐的機會有很多,但像軟工實踐這種有許多優秀老師指導點評的機會不多,我會珍惜這些機會,在下一次的作業中進行更充分的准備。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM