1. 程式人生 > 其它 >初級演算法題記錄(一)

初級演算法題記錄(一)

一、基本情況

1.1 請回望第一次作業,你對於軟體工程課程的想象

1.1.1 對比開篇部落格你對課程目標和期待,“希望通過實踐鍛鍊,增強計算機專業的能力和就業競爭力”,對比目前的所學所練所得,在哪些方面達到了你的期待和目標,為什麼?

在:

  • 程式語言的鍛鍊(主要是Python)
  • 目標檢測演算法的應用
  • 專案規劃和組織能力
  • 抗壓與學習能力
    這四個方面達到了我的期待和目標。個人、結對、團隊作業都鍛鍊了我的程式設計能力,其中團隊作業尤其鍛鍊了我專案規劃和組織能力,在我參與演算法方面工作的時候,我對目標檢測演算法的應用得到了良好的實踐,並且在各個科目和考試、作業的壓力下,我的抗壓能力、學習能力也得到了鍛鍊。在這四個方面的鍛鍊和收穫基本達到了一開始的期待和目標。

1.1.2 哪些方面還存在哪些不足,為什麼?

在:

  • 演算法的進一步優化
  • 團隊整合
  • 專案完全實裝
    這三個方面仍然存在一些遺憾和不足。雖然在實踐中,我對演算法的應用得到了實踐機會,但是同時也體會到了演算法存在的侷限性,由於時間和精力不足,沒有做進一步優化和嘗試有些遺憾;在團隊整合方面,不足的地方是團隊實踐週期較短,沒能進一步提高團隊的凝聚力,沒能進一步排解隊友在完成任務過程中遇到的心理障礙;專案完全實裝方面,考慮到完全實裝會涉及到許多方面的協調,在和相關利益方討論後感覺實在超出一個學生力所能及的範圍,因此選擇了退而求其次,以學習和技術儲備為目的進行專案,最後沒有實裝,有點遺憾。

1.2 總結這門課程的實踐總結和給你帶來的提升:

  • 在軟工實踐課程當中我編寫了 約3000 行程式碼。
  • 軟工實踐的各次作業分別花費的時間:
# 作業 花費時間(分鐘)
1-2 個人程式設計作業 3800
3 結對程式設計作業 2600
4 團隊介紹與選題報告 900
5 團隊需求分析報告 900
6 團隊專案之現場程式設計 180
7-13 Alpha衝刺(含總結) 1920
14-19 Beta衝刺(含總結) 900
  • 講述令你印象最深刻一次作業?為什麼這次作業令你影響深刻?

印象最深的大概是:第一次個人程式設計作業
印象深的原因是:做了兩遍,一遍C++一遍Python……此時回頭一看,統計一下竟然個人程式設計是花的時間最多的……平均下來每天3.5個小時花在軟工上。總結了一下最大的原因大概是“閒的”——學期初課少任務輕,閒下來沒事就敲敲程式碼。本來第一階段用C++做了75%左右,各種原因做不出來了,打算擺了,結果突然又多了一個星期,當即二話不說換語言繼續肝。
那段時間大概是最快樂的,因為一方面學期初不像期中期末各個課程都有各種任務,另一方面軟工作業確實是需要花一定量的時間的,因此非常心安理得地鑽到軟工作業裡去了,除了寫程式碼啥也不用想,就很開心。
相較而言,後面的結對和團隊階段(對我而言)的寫程式碼環境就不是那麼好了,一方面其它課程也有任務,另一方面團隊階段當隊長,要操心太多程式碼外的事情,沒法專心敲程式碼,很難受(雖然也有很多收穫就是了)。

  • 在軟體工程課程上花費的時間(預計花費時間參考:同時貼出開篇部落格“你打算平均每週拿出多少個小時用在這門課上”的回答)

開篇部落格估計一週大約花10h,實際上平均下來每週花了15.5h,感覺差的並不多,多的時間主要被用到部落格、PPT、企劃書、走訪、計劃這些上面,原來估計的每週10h當時想的是純程式碼時間,但是實際上除了程式碼外還有很多事情。

累計時間 實際周均時間 預計周均時間
187(h) 15.5(h) 10(h)
  • 介紹學習到的新技術或生產力工具以及它們給你帶來了哪方面的作用?
  • Python
    軟工初次使用Python寫專案,確實是比C++和Java爽多了,而且API也更多更全。感覺用Python寫程式碼效率突然高了幾倍。
  • 效能分析工具
    很直觀地展示出程式地的效能短板,能夠定量地評估函式效能,是優化程式的利器。
  • 單元測試
    單元測試是測試的重要工具和方法,讓我意識到了自己在寫程式碼的時候各種思維漏洞,並且有助於全面測試程式、抓蟲。
  • 原型設計工具(比如墨刀)
    墨刀是很方便的原型設計工具,特別是在組隊程式設計的過程中,為團隊成員的溝通提供軟體原型,大大提高了溝通效率,降低了誤解的發生率。也方便讓不瞭解程式設計的利益方對產品有一個直觀的認識,有助於使最終軟體產品讓各方面滿意。
  • pygame
    Python的一個庫,可以用來做各種小遊戲,很有意思,是增加程式設計趣味性,培養程式設計興趣的一個可靠途徑。
  • Yolov5
    開源目標檢測演算法,幫助了我們團隊專案的完成,使我對目標檢測演算法及其應用有了更深刻的理解。
  • UML圖
    理清需求、流程、例項的重要方式,有助於把腦袋裡的一團糊(說好聽點叫一個模糊的想法)理清楚,大大地有助於後續開發。
  • 軟體開發流程管理
    有助於軟體開發流程的管理,避免了很多團隊開發過程中可能出現的如互相推卸責任、摸魚、拖延症、應付了事等問題的發生。
  • PSP表、學習進度條、燃盡圖
    讓我對自己學習、工作的進度有了更直觀的記錄,並且時刻提醒我是否在虛度光陰,每週甚至每天是否有學到新的知識,是否每一分鐘都被明確地用於某項任務。有助於珍惜時間、提高效率、掌握進度。
  • 站立會議
    跟進進度,明確任務的好方法,能夠頻繁跟蹤進度、監督工作、確定將要做的工作和已經完成的工作。可以說團隊專案能夠完成,站立會議這一機制功不可沒。
  • 需求分析、企劃書
    理清專案需求、目的的好方法好途徑。並且為利益方、想要了解專案的人有一個比較正式的介紹,有助於專案的推廣(正式場合下的)。
  • 程式碼規範
    以前總是按自己的習慣作為程式碼規範,但是團隊合作中考慮到合作因素就需要有一套完整的程式碼規範來提高閱讀效率。在學習程式碼規範的過程中也逆向學習到了很多“規範思維”,理解了“規範”這一概念的必要性和好處。
  • 其他方面的提升。
  • 抗壓能力。當一堆考試、作業、實驗和軟工作業衝到一起時,就很考驗抗壓能力,挺過來就感覺海闊天空了,感覺抗壓的閾值提高了。
  • 危機處理能力。突發狀況的處理能力在軟工中得到了鍛鍊,我意識到了解決危機不僅要靠規劃階段的縝密思考,還要靠計劃階段為可能的危機預留時間,以及面臨危機時“以利益方的利益為核心”的處理原則,還有果斷做決定並承擔責任的勇氣。

二、總結與收穫

2.1 個人或結對或團隊專案實踐中的經驗總結+例項/例證結合的分析。

經驗總結:

工欲善其事必先利其器

例項分析:

  • 起初由於我急於求成,沒有太多考慮就選擇了大一大二使用的比較多的C++。結果到個人程式設計的中後期才意識到C++的一些侷限性,如:比較複雜,實現一些基本功能的時候需要操心很多東西;在搜尋引擎和github上找API的時候,找到的程式碼的數量和質量明顯低於Java和Python……例項:在github上找一個功能的函式的時候,Java得到的結果有60+,Python有40+,但是C++只有11個,而且都是沒什麼star的,很崩潰。中後期非常想換語言,但是又苦於沉沒成本。但是後來個人程式設計時間延長了,因此果斷換了Python,即使把“第二次做同一道題”這個因素考慮進去,使用Python開發還是比C++快太多、輕鬆太多了,只恨一開始沒有考慮仔細,用比較“鋒利”的Python寫專案。因此說“工欲善其事必先利其器”,工具的選擇對於生產十分重要。

經驗總結:

建立程式碼規範有助於捉蟲與優化

例項分析:

  • 個人專案的開始追求dirty and quick,只做了簡單的註釋,命名也是隨心所欲地起,結果後期捉蟲和優化的時候恨不得抽死幾天前的自己。C++的程式碼比較複雜、冗長,再加上我註釋沒有寫清楚、命名不規範,導致後期捉蟲和優化的時候遇到很大的阻力,總是看個十分鐘程式碼就暈頭轉向,降低了效率,增加了很多不必要的成本。例項:有一次找了一下午的BUG,然後才發現其實BUG很簡單只是幾個變數放錯地方,但是由於程式碼雜亂看著看著心煩意亂,一直找不到問題所在,結果找了整整一下午才把這個簡單的問題解決。深刻體會到程式碼規範的重要性。

經驗總結:

站立式會議對專案管理至關重要

例項分析:

  • 可以說從方法的角度看,本次專案之所以能夠循序漸進、按部就班地完成,很大程度上歸功於站立式會議。我們團隊的站立式會議流程大致如下:①確定過去一至兩天完成了什麼(定量);②確定將來一至兩天要完成什麼(定量);③確定接下來各方面交接的內容和具體要求;④方面內、方面間就專案實現細節進行交流討論。站立式會議幫助團隊確定專案進度、明確階段性目標、督促每個人完成工作、促進團隊經驗交流、避免誤解和降低溝通成本。例項:資料庫的建立和使用存在一定的出入,在站立式會議上的交流中發現這個問題後立即修正了。站立式會議從專案進度管理、專案內容交流等各方面而言都非常重要。

經驗總結:

避免畏難情緒,進行有目的性的學習

例項分析:

  • 面對不熟悉的工作的壓力時,人總是容易有畏難心理。在這次的軟工課程中我發現有的同學會希望從頭到尾學完他所認為需要的技術,然後再來進行實踐,隨後我意識到自己曾經也有過這樣的行為,並且最終任務沒有順利完成,所謂旁觀者清,我趁著這次機會從旁觀者的角度反思一下這樣的處理方式。在我觀察的幾個例項中,他們學習的內容往往和實踐所需的技術不夠貼切(即使在知道這一點的情況下仍然堅持從頭到尾學習某項技術),導致一方面花費大量時間在不一定馬上用得上的技術上,另一方面後續實踐的時候對真正所需技術還是一竅不通。我認為這是畏難心理所致,以學習為由不斷推遲實踐的到來,直到實踐再也無法推遲,則開始發現實踐仍然無從下手,從而焦慮和放棄。這樣的例項提醒我應該時刻關注自己正在做的事情是否真的對自己的目標有幫助,亦或是在自我安慰與麻木。此外也應該及時請教比自己厲害的人,諮詢技術建議,避免閉門造車。

三、致謝

  • 最感謝的是:許嘉濱
  • 想說的話:在做團隊專案的時候,演算法和前端基本算有經驗可循,但是後端組裡沒啥人有經驗,所以一開始我很擔心後面專案能不能真正部署到伺服器上。幸虧有了許嘉濱許大佬,扛起了後端80%的工作,才解決了後端的空白。並且在完成後端任務的同時,還積極為前端提供了技術建議,積極交流解決問題,為最終專案上線貢獻了一份重要的力量。
  • 也非常感謝比奇堡養老隊的隊友們。這是我第一次當隊長,隊友們對我的包涵與配合,構成了良性互動,通過九個人的齊心協力,讓專案最終順利上線。
  • 感謝隊友們對專案的認真態度:林經緯同學通宵做視訊、前後端在交付前主動開會衝刺、劉昌隆和黃榮濤同學積極貢獻演算法功能與提供展示效果……這一份份貢獻相信團隊的每一個人都看在眼裡,記在心裡。
  • 也感謝隊友們對專案的不懈努力:雖然團隊合作階段與許多考試重合,但是隊友們仍然齊心協力為團隊專案貢獻自己的一份重要的力量,專案之所以能有現在的完成度,離不開任何一位隊友的努力。
  • 稍微驕傲一點地說,我覺得我們的團隊可以說是“軟工夢之隊”(除了我這個不太會鼓舞人的隊長)——每位隊友都有責任感、勇於學習創造、積極合作交流。
  • 之後有機會的話希望仍然能和比奇堡養老隊的隊友們合作。