【作業】2020年高等軟體工程課程期望與篤信

HansBug發表於2020-10-06

【作業】期望與篤信

開頭一些自己想說的

之前的話,不管怎麼說,還算是順利地本校保研了,而且與自己相性良好的軟體工程專業,整體來說還算是順利。此時選擇了高等軟體工程課程,在這剛開始當然難免有些想絮叨絮叨的,還望各位看官老爺們海涵?。如果對此沒有太多興趣的話,可以直接跳轉到下一節。

其實也沒啥,不過就是老調重彈而已,此處是一點個人的過去履歷,本文不作贅述,也沒太多可說的。簡單來說的話,筆者自認為可以算是有一定的程式碼和工程經驗,對一些問題應該還算是勉勉強強有些理解

此外,筆者在本科期間,擔任過2019年度的物件導向設計與構造課程的助教組長,做了點微小的貢獻:

  • 分不同層次,調研了原有課程體系的問題表象
  • 基於問題表象,抽象了問題內涵,並理順了相關的邏輯關係,找到了幾點根本癥結所在
  • 基於上述分析,重新設計了課程制度,構建了全新的分散式課程系統,課程內容也一定程度上進行了重構,並最終取得了階段性成果
  • 此後,作為高階助教指導下屆助教的工作與進一步改革,並提供系統技術支援與指導
  • 再此後,卸任助教,擔任課程組顧問,參與部分課程事務並負責持續提供系統技術支援與指導

關於對這個本科課程的一些思考和說明,可以參考下我知乎上的回答,以及其他的一些部落格內容,此處不再贅述。其實說這些,主要是感覺如果是我的話,或許可以從一種不一樣的視角來看待這門新的軟體工程課程。

個人的一點碎碎唸到此結束,接下來是個人針對課程的一些思考。

個人對課程的理解與期望

目前讀了已經提交的幾篇部落格,能感覺到這些同學們不管怎麼說,態度很認真,很值得欽佩。不過也不得不說,確實體現出來了一些實實在在的問題,或者更準確的說,是此類課程都普遍容易存在的實實在在的問題。

之前筆者作為助教實際上也普遍發現了類似的情況,並做過一些學生視角層面上的思考。此外,還和老師們有過一些交流了討論,在此我作如下思考:

  • 軟體工程課真的沒有意義嗎?NO!作為過來人,我的感覺是,不僅有意義,而且意義大了去了。有很多課程上教的理論內容和實踐要求,恰恰在實際工作中是至關重要的。舉例來說,物件導向的各種設計要求,看似很無謂,但實際上正是有了這些,大規模團隊開發的質量才有可能得到保障。各種文件的撰寫,看起來很無聊很累,但是隻要專案一大,人數一多,對程式碼沒有充分且規整的記錄的話,那麼團隊協作將基本不可能,軟體的後續開發與迭代效率將以肉眼可見的程式急速下降,這對於任何團隊和組織而言都是絕對不可接受的。這些事情真正做過實際應用向工作的人應該沒有誰不明白的。
  • 但是為什麼這麼多學生就是覺得這些事很無聊很沒意義甚至很扯淡呢?恩,這是個好問題!其實生活中就有類似的場景——有相當一部分的中老年文學作者(當然普通人也大抵類似,只不過文筆不夠好不能做到讓自己的故事盡人皆知而已),回憶年輕的時候,都會發現自己的長輩某些勸告簡直是至理的,可是還有更微妙的一點,那就是這些人普遍表示自己年輕的時候可不懂這些,而且大抵還都一意孤行過。其實這個道理類似——因為這些經驗顯然不是空穴來風,都是經驗豐富的實踐者們用自己雙腳丈量出來的最好的路,可是這些都是建立在豐富實戰經驗的基礎上的,對於缺乏經驗的學生而言,這些就會很容易變得像是在單純的灌輸和說教,不僅起不到應有的效果甚至可能加劇反感
  • 那既然這樣該怎麼做呢?另一個好問題!私以為最根本也是最直接的解決方案就是將實踐真真正正的引入課程中來。很多時候,光說不練不可能領悟到真正的內容,在計算機這個專業,尤其是軟體工程這個方向上更是如此。理論終究還是為更好的實踐而服務的,都是無數前人總結出來的乾貨。而沒有充分的實踐經驗為基礎的話,思想意識上首先就不可能達得到這一層。私以為這也正是北航六系的一個亮點所在,幾乎所有的關鍵專業課的課程組,都在這一點上達成了高度共識。
  • 那應該怎樣在課堂這樣一個有限的週期內進行實踐訓練呢?這個問題問到點子上了。其實,不少類似實踐類課程之所以效果欠佳,倒並不是因為平鋪直敘,而是沒有處理好無限的工程實踐與有限的課程週期的這組矛盾。對於這個問題,比較容易想到的一種方式,就是加大工作量。實際上這毫無疑問是必要的,沒有充分的實踐經驗培養,很多問題的理解根本無從談起。但是另一個值得思考的問題在於——真的是越累越好,甚至於向辱而生麼?我個人覺得實際上並不必要,最佳的一個狀態,是強度保持較高且恰到好處的水平,並且課程本身需要具備充分的引導能力,將學生的付出引向正確的方向,簡而言之——好鋼用在刀刃上,讓師生助教的時間都花在正確且高效的地方。
  • 此外,課程層面上還有另一個值得注意的地方,那就是是否適合直接將產業用技術、方法及其工具鏈(下文統稱產業應用)直接引入課程教學中。這個問題我在之前的物件導向課程中也面對過,曾經使用的JSF是一個不算成熟且有頗多缺陷的實驗型工具暫且不論,後續引入的是JML、UML相關工具鏈,這是都在嚴格軟體工程領域有一定應用的,實際產業應用的推廣足以證明其對於產業的價值。但是產業的應用場景和教學的應用場景依然有很大的差別。具體來說,產業應用重在提高產業開發與協作效率,並且常常有一個基本的前提與假設——使用者是在以提高開發效率為目的進行工作的(類似於no evil原則)。而這個假設對於課程應用來說,可能會造成致命的後果,因為學生常常並不能做到這一點,恰恰相反很多學生更像是在為了通過某種考核而工作。而產業應用常常因為其需求性質,而不具備對教育與考核相關功能的充分支援,於是就會造成很多鑽空子甚至嚴重破壞教學與考核秩序的情況出現。當然,說這些不是說不應該引入產業應用,只是說不應該直接盲目地,生搬硬套地在課程中引入產業應用。為了解決這一問題有兩種基本思路,其一是基於產業應用,自行設計教學考核用應用,這樣可以做到量身定製但是對於課程組而言水平要求相當高;而另一種思路,則是進行充分調研分析後,設計出合理的教學內容與方法,輔助以完善的考核方法與制度,實現公平合理且引導性良好的考核

以上是本人對課程本身的期望,接下來說說我自己的。其實我自己的部分非常明確而簡單:

  • 希望課程能在我原本的一些基礎上,進一步強化理解與技能水平
  • 此外,希望這次帶團隊的經歷能給我帶來teamwork方面上的提高

大概就是這樣。

個人對專案的理解

巨集觀理解——如何做好團隊工作

在這裡,實際上筆者也認真拜讀了之前幾位同學的部落格作業,同樣的,我覺得他態度很認真,很值得欽佩,就這一點而言比我這樣十足的懶漢強的不知道到哪裡去了。那接下來,我這邊也儘可能結合過去的經歷談談自己對專案這件事的巨集觀理解。

讓我們回到這節的標題上來,如何做好一個專案,在巨集觀層面上我是這樣的看的:

  • 認清形勢。具體來說,這個團隊的牽頭者必須對行情有充分的瞭解,且具備冷靜理性的頭腦。不可陷入經驗主義從而作出不合時宜的判斷。
  • 具備合適的行動路線。基於上一點的準確認識,而規劃出一條比較適合此時此地此些人的行動路線,尤為重要。切忌基於過去或者他人的某些所謂“成功經驗”而全盤照搬,因為成功不可複製。
  • 合理統籌規劃。事實證明,同樣的一個班子,同樣的一批資源以及類似的所處環境,不同的規劃下實際做出的成果可能天差地別。作為計算機科班出身的人應該會知道一個問題,分散式系統的執行效率很大程度上取決於其內部的排程演算法。團隊工作也是類似的道理。
  • 充分的團隊協作。這一點依然很重要,畢竟無論什麼時代、去做什麼,最關鍵的都不是幾件紙面引數厲害的武器裝備,而是使用它們的人。一個團隊若是具備強大的凝聚力與行動力,那麼在風雨飄搖之時可屹立不倒,在衝鋒號響之時可重拳出擊,戰無不勝。

簡而言之,以上問題,分別解決的是幾個問題:

  • 我們是誰,我們在哪,我們有什麼?
  • 我們該往哪裡走,該去做什麼?
  • 我們該怎麼去做,該讓誰去做?

這些看上去像廢話一樣很簡單而又假大空對吧?但是實際上並不那麼容易都做到,這是很真切的體會?。不過如果能做得到這幾點,那很 多事情基本上已經算是可以正常運轉了,即便偶爾偏離航線也有充足的修正能力。某種意義上,巨集觀工作的優劣決定了專案成果的下限

微觀理解——如何做好合作開發

在上述的基本面上,想要做好合作開發,依然需要更加微觀層面上的一些注意點。此處我談一些個人的理解。筆者在微觀層面上是這樣看的:

  • 基礎要求
    • 全體人員的重視度與投入度。這一點毋庸置疑,也可以算是一個團隊最最基礎的,缺乏了這一點團隊基本沒什麼能量可言。
    • 團隊成員對整體技術棧的瞭解和把握。具體來說,就是需要對所需使用的技術棧與工具鏈等有充分的熟悉和了解,比如對java、git、對plantuml等工具的瞭解。這也屬於非常基礎的要求。
    • 團隊領導者對情況的掌握能力。具體來說團隊領導者需要對眼下的情況(包括成員內部關係情況,技術積累情況,資源積累情況等)有充分的認識和了解,並需要一定程度上具備抽象思維,將情況進行準確理解和描述。
  • 基本要求
    • 團隊成員的技能水平與熟練度。這一點和上面類似,但是對技能的要求更高一些,需要做到熟練操作並完成任務,並能夠形成一定的規範性,且保證質量可靠。
    • 團隊領導者對情況的分析能力。在充分掌握情況的基礎上,還需要做到對情況的分析,找出真正的成功關鍵,以及真正的失敗原因在哪裡,而不是人云亦云,或者頭痛醫頭腳痛醫腳。
    • 團隊領導者對各類資源的調配能力。在充分掌握資源狀態的基礎上,還需要能做到合理配置資源,做到充分的物盡其用,並做到充分的並行化以提高效率(實際上,大多數的團隊協作效率提高,其精髓都在於這並行二字)。
  • 進階要求
    • 團隊成員對大方向的充分了解與認可。實際上,一流團隊擁有共同的信仰,二流團隊擁有共同的利益,三流團隊擁有共同的敵人,不入流的團隊別名烏合之眾。一個團隊的大多數成員要是能做到很清楚自己究竟在做什麼樣的一個事業,並對此充分認可,而不是對某個領導者個人崇拜(這樣的團隊很脆弱)或者純粹逐利(因利而聚的團隊註定因利而散),那這樣的團隊將擁有前所未有的凝聚力和行動力,且堅不可摧。
    • 團隊成員之間的相互信任與支援。同上,團隊成員之間的充分信任,以及通力協作,可以極大減少團隊內耗,提高效率。
    • 團隊領導者的大方向把握能力。領導者需要對整個環境有充分認識,並基於此作出整個團隊未來走向的決策。這是關鍵中的關鍵,甚至可以說,哪怕別的全有而這個沒有,也八成會走向失敗。

以上算是個人的一些簡單總結,可能並不全面,還望指正?。這些方面則是一些具體執行層面上的注意事項了,一般來說想要做到雖仍需修煉,但並非遙不可及。做得到這幾點,意味著主線工作已經可以正常展開並有力推進了,能做到開足馬力向目標前進。某種意義上,微觀工作的優劣決定了專案成果的上限

提前分析——對自選專案的理解

我們組本次選擇的專案是Program knowledge提取,需要完成的工作有需求、設計、實現與測試。個人感覺,這樣的專案實際上說難也難,說簡單也非常簡單,難在一些前置的技術棧需要去充分了解,並且為了獲取最佳學習體驗,需要做足功課;簡單在於在完成上述的準備工作後,接下來就是系統設計與實現,這些都是本人足夠熟悉的領域。

實際上對我們這邊來說,完成任務是穩得,所以我認為更需要關心的是如何讓自己獲得真正的提高,而完成任務只是手段而不是目的。

勤能補拙——自我拯救補課計劃

考慮到筆者仍有較多不成熟的地方,所以筆者覺得自己實際上很需要進行一些補課,在此簡單列舉一下:

  • Java部分,筆者雖然有過一定的java開發經驗,並熟悉maven等工具的使用,但是依然有一定的知識空白需要填補,以適應複雜的程式分析需求。其中包含:
    • jvm底層知識,需要可以基於指令進行一定行為分析的程度
    • java語法深層知識,需要達到可以對程式碼語義進行定量分析的程度
    • 相關java工具鏈的使用,用於支撐語義的定量分析
  • 建模相關部分,筆者雖有過感性體會與實際操作經歷,但是並未太多深入研究過詳細理論,這部分尤其需要惡補。其中包含:
    • UML及其相關工具鏈的使用與理解
    • 在上述基礎上對建模這一概念本身的更深度理解
  • 團隊協作及資源配置能力,這個自不必說,團隊協作的成敗與我這個團隊leader有著重大關係。這個的話沒辦法很細緻的羅列補課清單,大概只能實踐中不斷學習吧。

一點隨意的總結和大量的胡言亂語

以上的部分算是我的一些思考,感覺自己還需要學習的東西還是太多了。而且,這注定不是一個輕鬆地過程,往往伴隨著破,以及而後的立,人這種生物,思維永遠帶有一股子慣性,想打破原有的舒適區並不是件容易的事,需要充分的覺悟與執行力。具體來說,當你隨便碼程式碼,碼習慣了碼爽了,然後有一天正兒八經教你如何像個正經工程師一樣的碼程式碼,這時候很多人就開始不願意了,也不為啥,就是不愛被管這管那,尤其青黃不接又不得不服從的那段時間,並不好受。但是當瓶頸過去了,才會明白,所做的這一切真的都是血賺的,關於這一點,懂的人都清楚。為此,我會拿出我的認真勁,並拿出學習的姿態來面對課程及其作業,因為我相信其意義,更相信自己。

此外,估計後續還會有選了這個課的人看到我的這篇部落格。為此我個人比較想提醒一句,如果你真的想要有所收穫的話,就請務必擺脫學生思維,以完全面向實戰的心態進行學習與訓練接下來的話可能會揭有些人的傷疤並引起不適,筆者對此表示遺憾並請玻璃心們主動繞行。首先我看到部分同學退選,而原因僅僅只是因為聽說課程是硬核的,就立刻打了退堂鼓。關於這件事我不想過多揣測他人,我沒這個德也沒這個能,況且有些人總歸是有自己的規劃的,對於這樣的人我們當然應該尊重,因為他們為了自己的信仰而去做了一件正確的事,這非常好。可是如果僅僅只是因為畏難就這麼撤了,或者沒有撤而選擇消極應對,那真的有些令人費解。首先,逃避可以解決什麼問題?逃避只能讓你除了收穫無底洞般的空虛和恐懼之外一無所獲。然後,請問您真的覺得就可以一直這樣下去麼?還真別說,我在本科階段遇到過不止一個這樣想的人。這些人一個普遍的特點,就是認為現實社會和童話一樣美好,其中一部分人覺得天下無賊歲月靜好,另一部分人更簡單,因為他們根本什麼都沒去想過,也壓根不關心,今朝有酒今朝醉,哪管明天是與非。他們壓根不明白,到了那個時候,自己的那點小確幸小尊嚴,以及引以為傲了十幾二十年的考試分數,在現實面前一分錢都不值,哪怕是最被視為硬通貨的文憑,在起到敲門磚作用後也和廢紙沒有本質區別。現實永遠是最簡單粗暴且不乏殘酷的,沒有那些奇異瑰麗的美景,取而代之只有——勝者與敗者、王侯與匪寇、生存及毀滅。筆者曾被這些人反駁過“為什麼課程要這麼難?”、“為什麼要和學生這麼過不去?”、“學這些有什麼意義?哪有一個用得上的?”、“我辛辛苦苦18年高考到這就是為了來被一門課為難的麼?”等種種言論,簡直無奇不有。對此,筆者的一個統一回復是——您和我在這掰扯沒用,請您直接去找你未來的上司、未來的老闆、未來的客戶、未來的競爭對手,還有未來來基於各種或利益或其他動機的敵對勢力去“友好商談”一下,看看他們會不會因為你們不知道幾年前曾經被叫做學霸會多考幾分抑或長得有點帥,就給你們如此“水”,如此“輕鬆愉快”的環境。然而事實是,他們不僅不會放你一馬,還會將你如同打獵般擊潰後提著你的腦袋殼去領功。到那時候,曾經在學校高潔風雅不可一世的您,充其量不過只是他們碗裡多出來的一塊排骨而已,吃完肉剃乾淨骨頭就被吐進垃圾桶,遂自仰天長嘯曰“世道不公人心不古”、“時運不濟懷才不遇”、“內卷之害甚矣”云云,嗤,止增笑耳,早知今日而又何必當初?。筆者忍不住想起了某位偉大的北大教員,因為他的思想實際上從未過時,過去如此,現在如此,未來也必將如此。

說多了,扯回來,不管怎樣,我個人是希望真刀真槍地再次強化自己的技術實力與技術理解。並且希望同組的小夥伴們也能完全以實戰的心態面對這次集體協作,而不是隻是為了完成課程甚至只是應付苦差事。這樣無論對自己,還是對組員,都是更好的。

相關文章