2022年11月24日 星期四

『Soft Skills 軟實力』建立自主學習的能力

關於這個章節對於「自主學習」的描述,以及十步驟學習的方法,我幾乎可以完全對照到本學期新課程的建置過程。

依隨事先「設計好的課程進度」,一步步的摸索並實作,到最後掌握足以授課的相關知識,然後進行教學。

看到作者將這個過程整理成「十步驟學習法」,可以更有系統的依照該流程去學習新事物,同時我也勉強算是這方法見證者之一。

以前我都會舉費曼學習法」為例,或許以後也可以拿十步驟學習法出來分享。

從我的經驗來說,步驟五「建立學習計劃」之前的工作,有著決定成敗的「關鍵影響」,後續當然也可以回頭來微調學習計劃。

當我每週都能達到預期目標時,是相當有「成就感」的,而過程中實作所發現的問題,再去探索答案,也激發了更強的學習動力以及學習效率。

雖然因為時間的緊迫性,壓力也不小,但總歸是一種「有效的學習方式」。

當自己要將過程中「實作的經驗」與「探索到的答案」分享給學生時,又要經過一番整理,將這散落四處零散的知識片段重整起來,有系統的分享與傳授。

其實我覺得每次開新課程,授課教師自己學習到最多,同時應該也最興奮,因為這本身就是一個典型的自主學習,雖然過程痛苦,但成果是甜美的。


本章節重點摘要如下:

如果在畢業之後就停止接受教育,會漸漸讓人生處於劣勢。

「自主學習」是一項關鍵能力,可以提升進階技能與知識。

學習某件事物的最佳方式是,在你甚至都不知道自己在做什麼之前,就跳下去開始做,要專注在「實際參與」並且「盡早去做」。

動手實踐前對一項主題有足夠的知識,就能挖掘出內心更強大的「創造力」與「好奇心」。

「唯有當你找出問題,而且想知道答案時」,才會有想法,知道什麼是重要的。然後再把學到的知識重新投入實踐,看學到的新工具是否適合當下的狀況,並解決問題。

探索新領域,了解需要解決的新問題,一步步深入想了解的知識,解決在實踐過程中所發現的問題,為自己所發現的知識感到興奮。

了解三個關鍵,學習一項新技術:

1. 如何開始,了解一開始需要哪些基本資訊。

2. 主題的廣度,要學習的事物範圍有多大以及該如何進行。

3. 基礎知識,學習哪些 20% 的知識,就足以應付工作裡 80% 的應用。


找出 20% 的關鍵知識非常困難,因此作者提出「十步驟流程」來學習一樣新技術;十步驟分別為:

1. 綜觀全貌。

2. 決定範圍。

3. 定義成功。

4. 尋找資源。

5. 建立學習計畫。

6. 篩選資源。

7. 學習恰到好處的基礎知識。

8. 實作。

9. 具備足夠學以致用的知識。

10. 教導他人。


其中前六個步驟是「專注於前期研究」,都只要完成一次,用來幫助達成自己的目標和建立學習計劃;這是整個流程中最重要的部分,決定未來學習計畫的成敗。

利用「時間表」幫助決定「學習範圍」,把主題的範圍縮到適合的大小,以符合整體的學習因素和可用的時程。

「成功準則」主要取決於你想從學習經驗裡獲得什麼,重點是確保你能在流程結束後,評估自己的學習成果是否符合目標。

「建立學習計劃」的好方法,就是看看別人怎麼教;好的技術書籍都會在每一章為後續章節奠定基礎。

「要找到正確的學習路徑」,在最短的時間內帶領你從 AZ,完成過程中的所有主要里程碑。

篩選資源,留下少數最有價值的部分,幫助你達成目標。

針對學習計劃裡的每個模組,重覆步驟七到十「基礎學習→實踐→深入學習→教學 的循環,直到實現目的為止。

多數人常犯的兩個學習錯誤,第一是在知道得太少的情況下就太快行動;二是事前準備工作做得過多,太晚投入。

要學習夠用的知識,讓自己能「盡早開始實作」,又不能多到沒有探索知識的機會,才能獲得最好的學習效果。專注於學習最小量的知識,只要足夠能開始下一步驟的實作即可。

先不要讀任何資料,直接開始實作,做中學。

這會在腦海中自然而然形成問題:這是怎麼運作的? 如果這麼做會發生什麼? 要怎麼解決這個問題?  這些問題會引導你找出實際上什麼才是重要的。

當你回頭去找問題的答案,這些你學到的知識不僅更有價值,還會記得更多,因為你學習的都是對你重要的事物。

「好奇心」是學習的關鍵,特別是對自主學習來說;快速學習的時期主要都是受到好奇心所驅動,想要了解世界是怎麼運作的,所以我們會問問題,然後尋找答案。

透過閱讀與實驗來解決實作過程中遇到的問題,隨著探索問題的答案,會學到更多與主題有關的新知識,盡可能徹底理解正在學習的主題。

要確定你已經學會某件事物,就是去教別人你所學會的知識。當你跟他人解釋時,無形中就能補足自身學習的落差。

這個流程會真正剖析與理解你正在學習的主題,也會以別人可以理解的方式來組織這些資訊。


教導他人的方法:

1. 寫部落格文章。

2. 製作 Youtube 影片或教學。

3. 簡報。

4. 和朋友或另一半對話。

5. 在線上論壇回答問題。

學習流程背後的觀念才是真正重要的事;付出努力才能學會如何教育自己。

2022年11月19日 星期六

『普林斯頓最熱門的電腦通識課』資料與資訊

資料探勘」早在十幾年前唸書時就有耳聞,但資料科學倒是近五年來才知道有這門學科。

就我的理解來說,資料探勘就是如何從大量資料中找出有用的資訊,而「資料科學」就是利用這些有用的資訊來做分析,從而達到預測的目的。

網際網路每天都在產生大量的資料,要用人為收集並篩選毫無效率,因此誕生了「網路爬蟲」來自動抓資料,這應該也是早期 Google 在建立搜尋演算法時跟其它公司有所差異的地方,它們的爬蟲跟建立索引的效率比其它搜尋引擎好上不少 (個人猜測)。

話說好幾年前在上「行銷課」時,有位老師超愛講網路爬蟲,然後再用以分析資料擬訂行銷策略;這樣看來資料探勘跟資料科學已經是「現代行銷學」的一環,作為行銷的工具被使用。

就是聽到這位老師一直講網路爬蟲,當年有位同學跟我還跑去中研院上 Python 網路爬蟲的實作課程。

因此,我覺得有志走「數位行銷」的人,未來除了「消費心理學」、「市場分析」與「產品定位策略 ( STP 分析)」的學習與應用外,也要了解資料探勘與資料科學,至少該知道怎麼在行銷的過程中使用它們,就算自己不會,還能找會的人來協助。

S是市場區隔 (Segmentation)、T是市場目標 (Targeting)、P是市場定位 (Positioning)。

最怕的不是自己不會,而是連這項工具都不知道,那就更別提找人來協助了。 

就創業家來說,初期的「 STP 分析」很重要,至於要不要做「數位行銷」就看所屬產業是否適合。

怎麼講著講著就從資料探勘跟資料科學講到數位行銷了,但在這個領域它們確實有很大的施展空間,一門學科能蓬勃發展那肯定是有了適合生長的土壤。

在數據爆炸的時代,能妥善應用的人就會脫穎而出

說到雲端運算,從十幾年前就已經有人提出相關概念,當時也有廠商提出相關產品;但多年前的基礎設施還不完善,網路速度也不夠快,也缺乏基於「雲端應用軟體」;再加上人們的使用習慣一時間無法轉換過來,導致早期推出產品的廠商都死在沙灘上。

來到智慧型手機的時代,人們慢慢習慣透過網際網路處理各種事務,這也給予「雲端服務」成長的動能,不管是 Google 推出的各式免費雲端服務 (包含電子信箱、行事曆、地圖導覽等),或是把線下服務搬到線上的網路銀行、電商及外送等,加上日漸普及的「電子支付」,都象徵著「雲端服務的輝煌時代」到來。

這也代表要一直新增「雲端伺服器」,相關產業都能分到一杯羹;現在由於生成式 AI 的崛起,「AI 伺服器」的相關產業更是受惠的一方。


本章節重點摘要如下:

資料探勘 (Data Mining)」是從大數據中尋求與萃取出潛在寶貴資訊與洞察的過程。

資料科學 (Data Science)是應用統計學、機器學習或深度學習,及其他方法與技巧來試圖了解資料,從中萃取意義,並據以做出預測的一門學科。

搜尋引擎的大部分工作是為查詢做好準備,把頁面資訊儲存及整理在伺服器上:使用「網路爬蟲 (web crawler) 」掃瞄網頁,把重要內容儲存於一資料庫中,以便能夠快速回應後續的查詢。

搜尋結果是根據一個「預先運算」的快取頁面資訊索引,不是即時的網際網路頁面搜尋。

以瀏覽器為基礎 (Browser-based) 的系統的反應速度可以媲美以個人電腦為基礎 (Desktop-based)的系統,並且讓你可以從任何地方存取資料。

雲端運算」的優點很多,它們供應的軟體總是最新的,資訊儲存於專業管理有大容量的伺服器上,客戶資料隨時都有備份;一份文件只有一個版本,不會發生同一份文件在不同的電腦上可能有不一致版本的情形。

2022年11月18日 星期五

『Soft Skills 軟實力』指導他人是掌握學習的不二法門

這學期授課時,常有作者提到的情況發生;某項技術主題我明明就用很多年了,可是當我要教給學生觀念或技術時,才發現原來「我只是懂其中一個部份,讓自己可以用來工作」而已,而非了解該技術的全貌。

重新整理授課內容後,又找出更多相關聯的方向可以突破;原先是要備課教導學生,反而是我變成了「最大受益者」,學到最多東西,也讓自己可以有系統的理解某個主題。

同樣的,當有朋友在詢問我對於他企業經營上的建議時,不管是分析經營的狀況又或是討論一些細節,總是讓我可以從「不同角度及角色」去審視每個事件的發生,反而看的更清楚一些。

當自己身在局中,往往看不清楚問題在哪裡,更別提要如何解決問題。

因此,我也認同作者所提及的「教導他人就是成就自己」,甚至因為要教學才會讓自己理解的更深入。

這部份,在先前的「費曼學習法」也有提到過,可以一併參考。


本章節重點摘要如下:

當你擔任導師的角色時,經常會比你所指導的人學到更多的東西,因為當你重新審視自己對一項主題的想法時,會從新的視角來看這項主題。

在你企圖協助他人時,會發現回答他人的問題能使你更深入了解一項主題的知識,甚至完全改變你的看法。

自我成長的機會,幫助別人也會讓你成長。

最棒的學習法就是指導他人,這或許也是深入學習任何事情的唯一方法。

教學就是把一些知識分享給其他人。

當我們首次學習某項主題時,往往會高估自己對這項主題的理解程度,很容易欺騙自己,以為自己真的很懂某件事,直到教導他人後才發現自己所知有多麼不足。

「教學」會強迫你去面對所有你已經擁有相當知識的領域,檢視你是否具有夠深入的能力,能充分向其他人解釋。

人類的大腦擅長「辨識模式」,經常能解決許多符合這些模式的問題,而不用真正理解自己正在做什麼或是為什麼這麼做。

當我們只想運用這些知識來工作時,不會去管我們是不是只有表面的理解。可是當我們嘗試想對某人解釋某件事的運作原理時,或為什麼要這麼做,認知上的漏洞就會暴露出來。

透過把某項知識教給某人的過程,會強迫自己面對跟這個主題相關的困難問題,更深入的探討,直到你從學習變成「理解」一件事。

教導他人無形中會強迫你的大腦重整資料。

剛開始學習某件事時,通常是很「零碎的知識」,以「混亂的方式」儲存在大腦;也就是大腦是在掌握一個觀念後,才引導你到下一個觀念,然後再帶你回到之前的觀念,最後才獲得以前尚未理解到的知識。

教導他人時,會思考哪種方式才是最好的說明方法,整理成文件、投影片檔案,這樣的動作促使「散落在大腦裡的資訊碎片放在一起,以有意義的方式重組」。

教別人之前,要先教會自己,這也是教學對自身學習有效率的原因。

教學是要幫助他人理解,而非證明你自己的優勢或尋求他人承認你的能力

『Soft Skills 軟實力』覺察自身的知識落差

總覺得這章的內容是在「說給我自己聽」的,頗有既視感。

我確實習慣掩飾自己的弱點,現在回想起來也覺得很可笑;明明知道自己哪邊偏弱或不安卻又不願花時間去加強,是有點在「逃避」的味道。

以前當學生時,對於理論工具如「微積分」、「線性代數」或「統計等不擅長,在唸碩士做研究時就盡量避開,往自己能力較強的程式語言或其它偏實務的學科方面下手,盡量以實作面取代理論面的創新,這樣也不是說不行,但其實是把自己的發展限制在一個範圍內。

還好當時有正視自己「英文」能力不行,未來會是一個顯著的「弱點」,這倒是有面對它,雖然過程中有好幾次想逃避,但最終還算有達到自己的目標;現在還是頗不擅長,但至少面對它時不會感到不安,因為心裡相信自己終究可以解決這方面遇到的困難。

在接近 40 歲的現在,我覺得還是要面對自身的弱點,解決理論工具不足的問題,讓自己在「創新研發」這條路上能走的更遠。

這個覺悟來得好晚,如果博士剛畢業回國的那個時間點有想通,那到現在應該也積累了不少能量吧!

人生沒有後悔藥可以吃,剛畢業時就一頭熱闖進「創業的世界」,想說好不容易拿到博士學位,應該不用繼續苦讀了吧,趕快賺錢比較實在;不過這到底算不算藉口,連我自己都搞不清楚。

理論工具的不擅長,確實制約了我在創新發展上的可能性,雖然後續又跑去唸了 MBA,這算不算是另一種逃避呢?  

從現在來看,應該不算,這個旅程至少讓我在「財務及「行銷上,有些不同於以往的想法,或許現在幫助與收穫都不大,但未來很難說;請參考我在「會計、行銷與創新」所寫的心得。

只能說,先面對它,才有機會解決它;這個道理人盡皆知,但發生在自己身上時,就好難做到阿!


本章節重點摘要如下:

如果不解決自身的弱點,通常會成為「限制職涯或人生發展的因素」。

發現缺乏的知識並且補足它們,越能幫助我們在工作上走得更長遠。

我們習慣掩飾自己的弱點,找藉口說自己太忙沒有時間停下來,把這部分的「知識落差」補上,避開自己覺得弱或感到不安的部分;就算明白「知識落差」對自身所造成的痛苦,往往還是不會有所作為。

當沒有「全盤透徹地理解」一件事,就只能笨拙地摸索去做,導致投入大量時間做重複性的工作。

不斷地嘗試覺察自己是否有任何無法理解或清楚的地方,列個清單持續追蹤相同主題出現的頻率。

填補「知識落差」的關鍵就是找出它們,一旦知道自己的「知識落差」為何,以及它如何阻礙自己的發展,通常就能弄清楚該如何填補落差。

重點是要確實了解自己需要「學習」甚麼,確定有將「焦點」限制在「明確的範圍」內。

當在對話或討論過程中遇到完全不懂的事,千萬不要掩飾,問就對了,這樣才能對每件事一清二楚。

2022年11月16日 星期三

『普林斯頓最熱門的電腦通識課』軟體總結

現代的計算機概論範圍也越來越廣了,從傳統的「硬體」、「軟體」到「通訊」及「資料」等;其中,通訊現在應該算獨立於計算機之外自成一派。

而資料科學則在近十年「機習學習」或「深度學習」變成顯學後,受到高度重視。

我自己也覺得未來要多加重視「資料科學」,畢竟現在的資訊太發達,資料太多反而讓人無法快速反應過來,就算不是資料科學的從業人員,也應該具備相關知識,才能更好的解讀被分析過後的數據。

話雖然是這麼說,但回想十幾年前唸書的時候,資料科學這個詞連聽都沒聽過,活著就得努力的追求新知識與新技能,科技進步的很快,但也要跟得上才行阿! 

不想變成時代的眼淚,還請多努力,別輕易躺平


本章節重點摘要如下:

「演算法」是一系列精確、清楚的步驟,執行特定的工作後停止;它敘述一個「與實作細節無關的運算」;這些步驟以定義周詳的基本運算為基礎。

演算法的複雜度是它的工作量的一種抽象描述,複雜度的衡量是看此演算法的基本運算的工作量是如何隨著資料量的增加而成長。

從最低等級的「對數曲線 (資料增加 1 倍只增加 1 個運算步驟)」、「線性曲線 (資料 1 倍運算 1 倍)」到「指數曲線 (增加 1 個資料項運算 1 倍)」。

演算法是「抽象」的東西,程式是要讓「真實」的電腦執行工作所需要的全部步驟具體表述。

撰寫程式必須應付的問題包括「有限的記憶體空間與時間」,用以表述數字的資訊量大小與精確度有限,以及經常變化的環境。

程式語言」是用以表示所有運算步驟的標記法,其形式要讓人能夠自在地撰寫,但可以被轉譯成電腦最終使用的二進制表示。

最常使用的是「編譯器 (或再加上組譯器)」,把用程式語言撰寫的程式轉譯成在電腦上運行的「二進制形式」。

目前「軟體開發」的工作有很大一部份是把既有的「元件」拼湊起來 (可能是函式庫裡的函式),這不少於自行撰寫的部份。

函式庫及元件透過應用程式介面 (API) 來提供它們的服務。

抽象化」是電腦運算領域的一個基本概念,從硬體到大型軟體系統,所有層級都存在抽象化。

尤其在「軟體的設計與實作」方面,抽象化這個概念特別重要,它把一個程式碼做什麼事和它如何實作這兩者區分開來。

軟體可被用來隱藏實作細節,如虛擬記憶體、虛擬機、直譯機及雲端運算。

程式的開發更加倚重已經被證明的軟體元件,隨著消費者的要求更多,程式將變得越來越大。

2022年11月14日 星期一

奇亞幣終於突破 10 XCH !

本來預期要到年底才會超過 10 XCH,想不到今天早上起來又發現爆幣一次,直接越過 10 XCH 的門檻。今年對於加密貨幣來說應該是災難年,比特幣價格的下滑,再加上近期 FTX 交易所的倒閉,讓人見識到這種新興金融產品的風險極高。

先前耳聞穩定幣的活存利率極高,應該在 5% ~ 8% 間,不過我當時手頭就有美股的殖利率也接近 8 %,所以不太理解為何要去追逐這種風險高度不可控的標的。

當然,買股票也是有漲有跌,但每個股票代號的背後都是一間公司,雖說也是有下市的風險或是公司做假帳的可能性,但風險相對可控多了。

也因為單壓個股有風險,所以我也盡量分散投資;不過控管風險不是我們不去接觸新科技的藉口,去年初在倫哥的建議下接觸奇亞幣,也因此變成農夫大軍的一員。

這中間的過程先前都有記錄起來,在還不成熟的階段開墾是很辛苦的,但現在已經漸入佳境,幾乎不用怎麼管它,只要按月記錄產出了多少 XCH 即可。

加密貨幣應該會再低迷一陣子,觀察到退出農夫大軍的人也變多,我們這些小農分到的也越來越多,說不定真的能夠提早達成 20 XCH30 XCH 的目標。 但最終目標還是希望「奇亞幣能走出一條跟現實世界接軌的路」,在現實中有價值才是最重要的。

2022年11月13日 星期日

『普林斯頓最熱門的電腦通識課』軟體系統

這章的概念在過去不同階段的學習中都有出現過,但經由作者放在一起,描述現代軟體系統的組成,就又更清晰了一些。

只不過這章節在敘述上,稍嫌雜亂,我想作者應該是想要前後文呼應,所以同樣的概念才會反覆出現。

我個人主要的「閱讀重點」是在軟體分層這部份,像作者所說的,如果換處理器或作業系統,只需要重新挑選編譯器,就能讓同一份應用程式的程式碼可以在不同平台運行,那就能大大節省開發的時間。

這部份通常被稱為「程式碼移植」工作,以目前的發展來看,要注意的是與特定硬體相關的「加速指令集 (SIMD)」以及與特定作業系統相關的系統指令。

如果希望自己的應用程式或函式庫,能在不同的處理器或作業平台上運行,為降低後續移植的困難度,應採用模型、介面與邏輯控制分離 (Model-View-Controller, MVC) 的開發模式,並在一開始就使用標準函式庫進行開發,同時為特定的指令編寫抽象/轉換介面。

現今嵌入式系統的硬體效能越來越強大,在擁有通用型電腦的特性下,通常都會運行簡化後的作業系統,因此嵌入式系統的開發越來越接近電腦上應用程式的開發流程,使用的工具與軟體元件越來越多,也導致「開發的進入門檻有變高的趨勢」

我甚至認為以後一個小型的物聯網裝置,就是標準的微型電腦,其效能可能都超過 25 年前的桌上型電腦,一個家庭所具備的算力非常驚人,新的世代一出生就被電腦包圍著,不曉得日本或美國科幻電影的情節會不會提早發生呢?


本章節重點摘要如下:

電腦上有兩大類軟體:「作業系統 (Operating System, OS)」 管理一台電腦的硬體,並使它可能運行其他「應用程式 (Applications)」的程式。

應用程式是專注於做單一一件工作的程式的標準用詞。

瀏覽器是應用程式的一種代表性例子,但它有與作業系統的相似點

近乎每一種電腦,NB、手機、平板、媒體播放器、智慧型手錶或相機等,都有某種作業系統去管理硬體。

早期的電腦並無應用程式和作業系統的區別。作業系統漸漸變得更精巧,與它們控管的硬體演進匹配。

Windows 是最常見的作業系統。蘋果電腦使用 MacOS 作業系統,許多幕後電腦使用 Linux 作業系統;手機也使用作業系統,如今通常是較小版本的 Unix Linux

一套作業系統控管及分配資源給一台電腦。它管理處理器,安排及協調目前正在使用的程式。

一套典型的作業系統將有數百個程式在同時作業,有些程式是使用者開啟的,但多數程式是非專業使用者看不到的系統工作。

作業系統管理主記憶體,它把程式載入記憶體,好讓它們能夠開始執行指令

現在的 Linux 有超過 1,000 萬行程式碼,由成千上萬的人歷經數十年撰寫與修改出來。據推估, Windows 10 可能有大約 5,000 萬行程式碼。 


作業系統如何運作

電腦電源開啟時,處理器便開始執行儲存於永久記憶體中的指令,那些指令從一個小的快閃記憶體中讀取指令,這指令要求去磁碟、USB 記憶體或網路連結中讀取更多指令,直到最終載入足夠的指令去做有用的工作。這種啟動程式稱為 bootstrapping,現在稱為 booting (開機)

啟動程序涉及檢查硬體,並載入連接硬體的軟體元件(drivers)。

作業系統提供一個建造應用程式的平台; 作業系統做應用程式請求的事,然後把控制權與結果交還給應用程式,這些系統進入點稱為「系統呼叫」,現代的作業系統通常有幾百個系統呼叫。


設備驅動程式

一個設備驅動程式是作業系統與一種硬體設備(印表機或滑鼠)之間的「橋樑程式」

驅動程式介面讓作業系統以一種統一的方式存取設備。作業系統是對一個抽象或理想化的設備做出要求,此設備的驅動程式讓其硬體執行這些要求。

通用型的作業系統有許多驅動程式,開機程序的一部分是把目前可用的設備驅動程式載入運行系統中。


其他作業系統

電子零組件越來越便宜,體積越來越小,使得可以在裝置中納入更多硬體,有更強的處理能力與記憶體,具有主流通用型電腦的元件與特性。

把一台數位相機稱為加了鏡頭的電腦又或是智慧型手機稱為加了通話功能的電腦。

「物聯網」也是以此為基礎:恆溫器、電燈、保全系統等,由「內建的電腦控制,連結至網際網路」。


應用程式

應用程式是在作業系統上執行特定工作的程式或軟體系統;它可能只專注做一件特定工作或處理廣泛的工作;可能是要花錢購買或是免費使用的;可能是高度專有的軟體或免費提供的開放源碼軟體。

Word Photoshop 都是應用程式的一種,它們具有可觀的商業價值,並歷經持續的演進增添新功能。

瀏覽器本來只是應用程式的一種,但現在越來越像一個作業系統提供給外掛程式、虛擬機及擴充套件等幾個層面延伸擴充。

Google 推出一種名為 Chrome OS 的作業系統,主要仰賴網路型服務。


軟體分層

軟體是分層結構,這能幫助程式設計師應付管理的複雜性,每一層做不同的事,並提供一個讓上面那層能用以存取服務的抽象概念。

最底層是硬體,往上一層是作業系統 (核心 kernel),把硬體的特定屬性隱藏起來,向應用程式提供無關硬體屬性的介面。

把一個程式移到一個新的處理器上,只需要用一個合適的編譯器去編譯這程式即可;如果一個程式越是和一特定硬體的屬性緊密關聯,就越難轉換。

蘋果在 2020 年中,把所有平板、電腦從 Intel 的處理器轉換成 ARM 處理器,這個例子展示了軟體可以獨立於特定的處理器架構之外。

作業系統再往上一層是一群「函式庫」,提供通用的服務,讓個別的程式設計師透過應用程式介面 (APIs) 來存取這些服務,如:數學運算函式、日期與時間運算、圖形使用者介面 (GUI)、壓縮等。

作業系統的核心功能主要有:記憶體管理、檔案系統、網路連結、控管裝置及處理器,主要是協調兩種以上應用程式存取資源,互不干擾。

現在「所有的電腦 (包含嵌入式裝置)」都有一套作業系統,發展趨勢正朝向使用 Linux 之類的通用型作業系統,而非使用專門型作業系統。

現今使用的任何重要技術中都含有一個以上重要的「軟體元件」

2022年11月8日 星期二

『普林斯頓最熱門的電腦通識課』 編程及程式語言

從電腦程式語言的歷史來看,進入門檻越低且容易取得相關資源的程式語言會被廣泛使用。因為我一直是專注在機器視覺與影像處理的演算法與應用軟體開發工作,在這個領域效能是相對受到重視,基本上 C/C++ 就是基本要會的工具,越熟練越好,甚至十幾年前還要想辦法去寫 MMX 加速指令集的組合語言。

當然,現在還是要熟悉 SSE/AVX/NEON 等跟 CPU 相關的加速指令集,才能讓函式功能的效能符合工業界的要求。所以我一直沒有考慮用其他語言來開發相關演算法,導致忽略了近十年來最熱門的 Python

後來因為授課需求,使用 Python 來呼叫自建的函式庫後,非常驚訝它在開發上的易用性以及各種豐富的專業領域函式庫資源,非常適合專業上的學習與實作,類似機器學習、影像處理、機器視覺、數值運算等課程應該都可以導入使用。

同時,因為機器學習與深度學習的推廣助攻,又讓 Python 的能見度更上一層樓,我覺得以後應該會普及到中小學生就開始學習。

從組語式微變成高階語言的天下,再到 Python 的市佔率逼近第一名,都顯示現代程式語言的開發已經轉向重視易用性、安全性及函式庫支援的豐富程度,而非單純講求執行階段的效能。 如同作者所言,現在讓他只能學一種程式,首選是  Python

在「培養技術能力」也曾經提到過,現代的軟體開發更重視軟體元件(函式庫)的整合使用與架構,更勝於程式語言本身的特性。

雖然因為效率因素,我還是必須使用 C/C++SIMD 加速指令集來開發演算法,但未來授課會以 C/C++ 來進行函式庫的設計與包裝,然後以 Python 來做為驗證與教學用,在應用端降低使用門檻,藉此提高學習意願與效率。 

開放原始碼應該會是各個領域軟體發展的主流,對此我抱持樂觀態度,也許有一天我也能加入這個行列,並藉機了解開源專案要怎麼賺錢?  這也是我的一大疑問阿!


本章節的重點摘要如下:

「程式」具體敘述一台真實的電腦為完成一項工作而必須執行的每個步驟。一個演算法和一個程式的區別,就像一份「建築設計圖」和一棟「建物」的區別;一個是理想化的東西,另一個是真實的東西。

把程式看成用一種讓電腦能夠直接處理的形式來表述一種或多種演算法。程式必須考慮實際問題,包含不充足的記憶體、有限的處理器速度、無效或甚至惡意的輸入資料、有問題的硬體、中斷的網路連結以及「人為疏失(導致其他問題惡化的主因)」

組合語言:當使用組合語言時,組譯器的角色是用來追蹤每一條指令,和每一個資料值的記憶體位置,不需要程式設計師以人工的方式做簿記。

一特定處理器架構使用的「組合語言是該架構專門使用的」,這組語通常和處理器指令一堆一地搭配,它知道哪些指令是如何用二進制編程,資訊是如何存入記憶體。

用組語為特定處理器 (Ex. x86) 撰寫的程式,將不同於為另一個處理器 (Ex. ARM) 的相同工作撰寫的處理器。 如果想轉換程式到另一台處理器就必須重寫。

高階語言:高階程式語言獨立於任何特定的處理器架構之外,亦即非特定處理器架構專用,它的運算表述方式更接近一般人的表述方式。

用高階語言撰寫的程式由一種翻譯程式 (translator program) 轉換成一特定處理器的組合語言指令,再由組譯器轉換成位元,載入記憶體及執行,這翻譯程式通常稱為「編譯器 (compiler)」

實務上,一個編譯器內部可能被區分成一個「前端」和幾個「後端」,前端負責把高階語言撰寫的程式處理成某種中間形式,每一個後端把共通的中間形式轉換成其特定架構的組合語言。

高階語言更接近人們的思考方式,因此更容易使用與學習,不需要知道任何特定處理器的指令集,也能有效地用高階語言來撰寫程式。

因為高階語言的程式獨立於任何處理器架構之外,相同的程式可以在不同的架構下運行,通常不需做任何修改,只需要用一個不同的編譯器去編譯它就行了。寫一次程式可以在不同的電腦上運行,程式開發成本就可以分攤到多種電腦上。

六種最重要的高階語言,Fortran, C,  C++,  Java,  JavaScript,  Python

在電腦昂貴、慢且資源有限的早年,有人擔心用高階語言撰寫的程式效率太低,因為編譯器無法像一位技巧嫻熟的組合語言設計師那樣產生簡潔且有效率的組合程式。

今日電腦速度及記憶體皆已為當初的數百萬倍,程式設計師鮮少擔心個別指令的效率。

1973  「C 語言」推出至今,語法只改變了一些,至今仍是最受歡迎及最被廣為使用的程式語言之一。

C++是從 C 演進而來,多數情況下一個 C 語言程式也是一個有效的 C++ 程式

現今在電腦上使用的主要程式,大都是用 C C++ 撰寫的。Unix Linux 這兩個作業系統都是 C 程式,FilefoxChrome Edge 這三種瀏覽器都是 C++ 撰寫的。

90 年代,因應網際網路及全球資訊網的成長,「編程速度及便利性變得比機器效率更為重要」Java JavaScript 之類的程式語言就是刻意做出這方面的折衷。

Java 原本是針對內建於家電及電子裝置的小型系統而開發的程式語言,靈活性比速度重要;後來 Java 在網頁伺服器上廣為使用。

當造訪一個網站如 eBay 時,電腦跑的是用 C++JaveScript 撰寫的程式,但 eBay 可能是使用 Java 來撰寫它送到你的瀏覽器上的網頁。

Java 也是撰寫 Android 行動應用程式的首選,它比 C++ 簡單 (但也漸漸朝向相似於 C++ 的複雜程度),但比 C 語言更複雜。

Java 也比 C 語言更安全,因為它去除了一些具有安全性隱憂的性能,並有內建機制去處理容易出錯的工作,如管理記憶體中複雜的資料結構。

「JavaScript 是源於 C 語言家族中的一種程式語言」,但有很多的差異;JavaScript 和 Java 沒有關係,它的原始設計目的是要用於一款瀏覽器上,以在網頁上達成動態效果;現今近乎所有網頁都包含了一些 JavaScript 程式。

Python 在語法上有些不同於 C, C++, Java 及 JavaScript,它用縮排來表達敘述的開始與結束,而非使用大括號 { }。 

Python 在設計之初就聚焦於可靠性,它易於學習,已經成為最被廣為使用的程式語言之一,有大量用它撰寫的軟體,涵蓋近乎任何你能想到的編程工作。 

若要作者只學習或教導一種程式語言的話,他會選擇 Python

程式語言未來的發展走向,應該是讓程式撰寫更容易以及更安全的程式語言。 「C 語言是極其高效靈活的工具,但它很容易不慎地犯下程式撰寫的錯誤」,在被發現時可能已經被利用於惡意目的。

新的程式語言比較容易防止犯錯,或至少能偵測出一些錯誤,但為此得付出運行較慢及使用更多記憶體的代價。

「緊湊、快速的程式」仍然對很多應用領域如車子、飛機或武器等非常重要,因此仍然會使用 C 語言這類高效率的程式語言

經驗豐富的專業程式設計師,可能稱得上熟練十幾種程式語言,但他們不會對所有這些程式語言都具有相同水準的技能。

軟體開發:作者專案課程的學生以小組方式作業,經常以八到十週的時間交出兩三千行程式碼,這段時間他們需要設計他們的系統,通常是一個容易存取某個大學資料庫的網路服務,或是一款手機應用程式。

函式庫、應用程式介面,開發套件:很少有任何大程式是完全從零做起而創造出來的,有很多現成、他人撰寫的元件可供直接使用。

程式撰寫的工作中,有很大一部分是了解這類元件,以你自己的方式去把它們結合起來

這些元件本身的建造大多也是倚賴了其它更簡單、更基礎的元件,而且往往是幾層的元件。通常這一切都是在作業系統上運行,作業系統程式管理硬體,控管發生的每件事。

在最簡單的層級,程式語言提供一個函式 (function) 機制,讓程式設計師能夠撰寫程式去執行一個有用的運算,再以一種形式包裝這程式,讓其它程式設計師在無需知道它是如何運行的情況下,用在自己的程式中。

函式讓程式設計師可以使用已經被分別建造出來的元件來撰寫程式,所有程式設計師在需要時都可以使用這些元件。

一個相關的函式集合通常被稱為一個「函式庫 (Library)」,例如 C 語言有一個標準的函式庫 (stdio.h) 去讀取儲存於磁碟或其他地方的資料,或把資料寫入磁碟及其他地方。

如何知道一個函式庫提供哪些服務,以及程式設計師如何知道該如何使用這些服務? 這就要談到應用程式介面 (Application Programming Interface, API)。

API 敘述一個函式庫提供的服務,這個函式庫裡有哪些函式,這些函式做哪些事,如何在程式中使用這些函式,它們請求甚麼輸入資料或資料結構,產生甚麼值或資料結構。

API 定義程式設計師在請求函式庫提供服務時,必須做什麼,以及這些函式將運算什麼。它不僅包含有關語法規定的聲明,也包含支援文件以幫助程式設計師有效設計系統。

現在的大型系統往往涉及一個軟體開發套件 (Software Development Kit, SDK),讓程式設計師能使用越來越複雜的軟體函式庫,類似 Android Studio、Xcode 及 Visual Studio。


智慧財產:智慧財產指的是個人的創造行動 (例如發明) 所產生的種種無形財產或著作,例如書籍、音樂、畫作、相片等。

軟體也是一種重要的智慧財產,它是無形的,但很有價值,開發及維修一個大程式需要持續的辛苦努力。

軟體可無限量複製,邊際成本趨近於零,且可線上傳送至世界各地,並隨時被修改。但軟體比硬體更容易衍生法律問題,有幾種法律機制保護軟體的智慧財產,包括「商業機密商標著作權專利及授權」

商業機密是最明顯的智慧財產,被所有權人保密,或是只在具有法律約束力的合約 (例如保密協議) 之下才揭露。這既簡單也有成效,但若機密被洩露,無法提供什麼救濟行為,典型例子是可口可樂的配方。

理論上,若機密已經變成公開知識,任何人都能製造同樣的產品,但他們不能稱之為「Coca-Cola」或「Coke」,因為這是商標,另一種形式的智慧財產。

商標是用以區別一公司提供的產品或服務的一個詞或詞組、一個名稱、一個標誌,甚至一種獨特顏色。

著作權保護創意的表述 (expression);一般人很熟悉文學、藝術、音樂及電影等領域的著作權,它保護創意作品不被他人抄襲,並且賦予創作者在一定期間內利用其作品的權利。

數位資料的著作權執法相當困難,著作權也適用於程式,如同小說撰寫一樣,無人可以不經我的准許使用我取得著作權的程式但若只是了解程式的行為後,撰寫全新的實作(implementation),那可能就「不算侵權」。

專利對發明提供法律保護,不同於著作權只保護表述 - 只保護程式是如何撰寫的,而專利會保護程式中內含的原始概念。

授權是撰寫使用一項產品的法律合約,在實體店或線上購買軟體,大多是授權而非出售。就大多數的購買而言,法律上的第一次銷售原則,若你買了一本印刷書,它就是你的,你可以轉賣或送給他人,但是數位產品的供應商幾乎都是以授權的方式「銷售」,這讓供應商保留所有權。

開放源碼 (open source) 指的是把原始碼開放,供研究與改進。

程式語言及支援工具現在幾乎都是開放源碼,把軟體送出去,要如何賺錢呢? 像 Red Hat  銷售你可以在網路上免費取得的 Linux 原始碼,但它靠著提供支援、訓練、品質保證、整合及其他服務來賺錢。

許多開放源碼程式設計師是公司的正式員工,這些公司使用開放源碼,並對它做出貢獻。這些公司受益於能夠引導程式的演進,以及有其他人修補漏洞及做出改進。

2022年11月5日 星期六

今日閱讀: 會計思維(全) 會計、行銷與創新

作者在會計觀點或策略外,說明品牌效應的本質,就是要營造超乎預期的效果或感覺,先前在「以價值為基礎的定價法」中有討論過相關概念。

作者是日本人,特別強調工作的義務感和負債感,並認為在工作上額外付出是合理的做法,這些付出未來會以另一種形式回饋給自己。

常聽到領多少薪水做多少事的講法,身邊不管是同學或朋友,多數人是抱持這種想法,這應該就是所謂的會計觀點。

主要問題是在多付出的何時會回饋,用甚麼方式能收穫? 這些都充滿不確定性,所以多數人還是寧願選擇「等價交換」吧!

在我看來,個人也是有所謂的「品牌效應」,當我們願意多做一點,不執著等價才能交換時,或許就能慢慢贏得別人的信賴,這部份從過往的經驗中,深有體會[開發副業專案]。

至於「免費策略」,作者的想法跟剛做完摘要的[創業與職涯規劃]雷同,其重點在於創造大量有價值的免費內容,來實現「集客式行銷」。

利用免費內容為他人提供超出預期的價值,建立目標聽眾,來打造自己的品牌。

以創業來說,「行銷」與「創新」是公司營運活動的兩大重點,講直白點就是「怎麼賣」跟「怎麼做」,而會計思維就是站在財務平衡的角度來看待這兩樣關鍵活動。

這部份其實很難理解,創業家很有可能都是在似懂非懂間前進。

像我自己是技術背景出來創業[創業至今的感想(上)創業至今的感想(下)科技創業在台灣之我見],正常來說創新這部份問題應該比較小,但事實上當創業後心力分散到會計、行銷及日常營運後,慢慢就會降低對「創新」的關注度。

由於每個月都會看到公司報表,時刻提醒自己財務的狀況,心態上就會偏向會計思維,想要撙節開支,刪減行銷與創新的費用。

至於「行銷」,怎麼經營公司品牌,坦白說剛開始是兩眼一摸黑,按照常見的做法參加展覽及相關協會,並參與教授學校與業界課程,希望能借此拓展公司業務;但這模式的成效不彰,雖然有累積一些客群,卻無法達成設定的目標。

因此,如何平衡會計、行銷與創新這幾項公司經營要素,是創業家一生的功課。

我近期就在著手嘗試用「最小成本」來改變創新與行銷的既有模式,這些想法主要也是從閱讀與傾聽而來;更重要的是後續的實踐,如此一來才能具體評估改變的成效為何。


本書重點摘要如下:

會計高手會發現企業的力量還是靠營業額。

無論是重組、刪減經費或展開新事業,如果沒有先達到一定的營業額規模,一切也無從談起。

營業額增加,顯示顧客認為企業提供的產品和服務物超所值,正是有了這樣的「顧客基礎」,企業才有資格去談重組或展開新事業。

商品的銷量是由消費者來決定,不是企業主觀可以決定,包含其他人參與其中。

營業額是公正的指標,最近越來越流行「經營瘦身」,批判一昧追求營業規模的經營方式,這種想法肯定有其道理,但也過份低估了營業額的價值。

訂價是經營者的工作,決定企業的產品和服務該以什麼價格銷售,需要絕佳的經營判斷能力。


訂價方法可分以下幾種:

1. 成本導向訂價法,把成本加上利益,得出產品價格。因為不存在定價低於成本價的風險,要加上多少利益也是自己全權決定。

2. 競爭導向訂價法,比較其他競爭公司的同類型產品或服務,訂定一個適當的的定價,是一種策略性的訂價方式。

3. 市場滲透訂價法,為了爭取市佔率,不惜把銷售價格壓得比成本還低。例如 PS 遊戲機剛推出時,SONY 是以低於成本價銷售,靠低價策略佔領市場,然後藉由銷售遊戲軟體,以及降低遊戲主機的生產成本來獲取利益。

4. 吸脂訂價法,在產品上市初期將價格訂高,儘快回收費用。

在為產品訂價時,成本以及其他競爭對手的狀況非常重要,但也不能忘記最能突破消費者心理的訂價設定,那就是「心理價格」。

能夠產生「品牌效應」的本質,應該是超出預期,提供高於價格的服務,慢慢地培養出品牌力。

單從「會計策略」的角度來看,提供高於等價價值的產品或服務,會造成企業的損失。但沒有損失的等價交換,對客戶而言也只是一場不賺不賠的交易,那該如何提供高於價格的附加價格呢?

如何提供高於價格的附加價值呢? 勞動在本質上就是提供「超出預期的價值」,對於已經拿到手的薪水,該怎麼回饋?  

這種義務感和負債感正是勞動的本質,人一不小心就奉獻出遠超薪水的回饋,但這些付出又會以另一種形式回饋給自己。

對上班族來說,額外付出可能另一種形式回饋給自己,如客戶對你的信任、在公司內部的評價上升,也可以是工作技能的提高;如果是企業,收穫就是「品牌效應」。

提供超乎預期的服務,最後還是會獲得相應的回饋;所謂的經濟,與其說是嚴謹的「等價交換」,不如說是在付出與收獲的時機之間,取得一個最佳的平衡點。

在會計觀點要避免提供過多價值,但如果轉移到打造「品牌效用」時,卻需要積極實踐。

企業經營,需要的正是這種超越會計思維的經營判斷

免費是最強武器!  超出預期的終極訂價策略,免費提供。既然沒有要拿回等價報酬,免費提供的價值全都超出預期的服務。

積極的「免費策略」,往往會產生意想不到的結果。

除了未來發生的營業額外,還能學到專業技能,建立「信賴關係」;這種方式建立的信賴關係,便是金錢無法買到的「品牌效應」,這種信賴之後會轉換生意與金錢回到自己身上。

大眾文化有個特性,就是不壓低成本就很難普及;網路上的許多內容也因為大多免費,為社會帶來極大的變化。

熟客才是生意長久的根本! 事業的持續性並不是由企業規模或資產多寡來決定,而是由商品的熟客,也就是由粉絲獲得保證。

會計與行銷為一體兩面,中間夾著「庫存管理」;庫存過多需要報廢,會虧損;庫存過少則會造成機會損失也有可能錯失商機的風險。

讓庫存保持在一個適當的平衡點,只有結合價格設定、免費策略、品牌效應和掌握熟客等「行銷策略」,會計思維才真的能活起來。

在這樣的時代,庫存決定生死的關鍵,透過市場行銷來喚醒消費者的需求,同時再根據需求管理庫存,就變成「企業經營」的重要課題。

服務業的庫存就是人才,員工過多就會產生剩餘人力,員工過少又會忙不過來。

會計思維: 盡可能削減人事費用。

行銷思維: 人事縮減過頭,有可能錯失商機。

會計思維只是以某種特定觀點看待事物,它的缺點就是只能看到現實的一個面向,有時會錯過其他重要的要素。

「品牌效應」等沒有被放進資產負債表的要素,指出了會計思維的局限性。

可以從行銷的觀點,將一些會計看不到的東西挖掘出來,不管是會計中出現的計算,或是行銷中產生的感覺,這兩種立場都很重要。

還有一個重要的觀點就是「創新」。

彼得杜拉克對管理的功能提出以下說明:「企業的目的是創造客戶,所以企業有兩大基本功能→ 行銷與創新,這兩大功能才是創業家的功能。」

想要獲得客戶,除了行銷外,創新也不可少;但在會計上創新這個要素也會被排除在資產負債表外。

創新要素包含:能開發新技術的優秀員工、經驗豐富的資深員工,或公司內部積累的知識技術等,這些要素和行銷有關的顧客基礎一樣,在會計思維上都很容易被忽視。

會計視角會排除「行銷」和「創新」兩大功能的重要性,因此無法僅靠會計思維來做判斷。

但如果完全不從會計視角考慮,便進行行銷或創新,也是在走鋼索。

對創業家來說,客戶是誰? 需要怎樣的行銷策略? 應該展開怎樣的創新,時刻牢記這些在資產負債表外的要素,並發揮會計知識的長處才是最重要的。

請將會計、行銷與創新的重要性,刻印在腦海中。

2022年11月4日 星期五

『普林斯頓最熱門的電腦通識課』人工智慧與機器學習

「人工智慧與機器學習」在這幾年間變成顯學,在十幾年前我唸書的時代還頗為冷門的一個領域,想不到就這樣大翻身了。

記得以前研究所上課通常是叫做「模式識別與機器學習 (Pattern recognition and machine learning)」,講一堆分類器,然後就沒有然後了。

過了 15 年後,再接觸這門學科時,倒是覺得挺有趣的,可以跟我本來的專長影像處理與機器視覺相結合,而且它也是屬於那種可以自己實作看結果的科目。

唯一的障礙是有很多的「數學與統計觀念」要重新理解,但在我看來,數學與統計跟程式一樣都是工具,必須先熟練這些工具後,才能更有效率的解決問題。

還好我的程式能力勉強算可以,再來就花上幾年時間積極擁抱這個領域吧!

接下來應該會繼續熟悉「資料科學」的建模基礎跟統計實務,機器學習是資料驅動 (Data Driven) 的學科,資料的取得與篩選跟適當模型的選擇一樣重要。

既然要做,希望自己至少能掌握這個領域 20% 的關鍵知識,來應對 80% 的實務問題 (80/20 法則)。

如何在有限時間的情況下,拓展原來的領域範圍,並且有加乘的效果,就要參考「費曼學習法」。

因此希望未來有機會教授「機器學習」這門課,教中學效率更好,有時邊講課大腦自動連結既有知識樹時,也會有令人意料不到的新想法出來,最近感受特別深刻。


本章節重點摘要如下:

人工智慧 (Artificial intelligence) 泛指使用電腦去做我們通常認為只有人類能做的事,「智慧」是我們認為人類才具有的東西,「人工」意味的是,電腦也會做。

機器學習 (Machine learning) 是人工智慧的一個子集,指的是一大類方法,被用於訓練演算法,以使它們能夠自行做出決策,從而執行一些我們稱之為「人工智慧」的工作。

機器學習跟統計學是不同的東西,但兩者有重疊的地方:在「統計分析」中,我們使用一個機制模型來產生一些資料,然後嘗試找出這模型中與資料最吻合的母數 (parameter, 參數);反觀「機器學習」並不使用一個模型,而是試圖在資料中找出關係。

統計學與機器學習都是「機率性質」:它們得出的答案有可能是正確的,但不能保證必然正確。

「深度學習 (Deep learning)」 是機器學習的一種,使用相似於人腦的神經網絡的運算模型。深度學習的實作大致模仿人腦的處理方式:一群神經元偵測到低階特徵 (low-level features),它們的輸出訊號成為其它神經元的輸入訊號,然後這些神經元根據前面神經元偵測到的低階特徵來辨識更高階的特徵;伴隨系統的學習,一些連結增強,其它連結減弱。

深度學習在電腦視覺方面非常活躍,有大量不同的深度學習模型。

典型的「機器學習」基本概念是對一種演算法給予大量的例子,讓它自行學習,不給它一套規則,也不明確編寫程序讓它去解決特定問題;最簡單的形式是,我們為程式提供一個標記了正確值的訓練集 (training set)。

舉例來說,我們不試圖建立如何建力辨識手寫數字的規則,而是用一個大樣本的手寫數字去訓練一套學習演算法,對每個訓練資料標記其數值,這演算法使用它在辨識訓練資料時的成功與失敗來學習如何結合這些訓練資料的特徵,得出最佳辨識結果。

所謂的最佳,並不是確定的:機器學習演算法盡力去提高得出好結果的機率,但不保證完美。

訓練後,演算法根據它從訓練集學到的,對新的資料進行「分類」,或是「預測」它們的值。

使用有標記的資料 (labelled data/tagged data)來學習,稱為「監督式學習 (supervised learning)」

大多數監督式學習演算法有一個共通的架構,它們大量標記了正確類別 (正確值) 的例子,演算法根據這個訓練集,研判能讓它得出最佳分類或做出最佳預測的參數值;其實就是讓它學習如何從例子做出推斷。

我們仍然得告訴演算法,哪些「特徵」能幫助做出正確研判,但我們不對這些特徵給予權值或把它們結合起來。

「機器學習」演算法可能因為種種因素而失敗,例如「過度擬合( over fitting )」,演算法對其訓練資料表現良好,但對新資料的表現較差。或是沒有足夠的訓練資料,又或是提供了錯誤的特徵集,又或者演算法產生的結果可能確證了訓練集內含偏誤。

分類型 (classification) 演算法:對資料項做出正確分類,數位辨識系統、垃圾郵件偵測。

預測型 (prediction) 演算法:試圖預測一數值,如房屋價格、股市趨勢等。

「非監督式學習 (unsupervised learning)」 使用未加入標記的訓練資料,亦即沒有對資料加上任何標記或標籤。

非監督式學習演算法試圖在資料中找出型態或結構,根據資料項的特徵,把它們分組。

K群集分析 (K-means clustering) 把資料分成 K 群,讓每一群中的資料項相似度最大化,且各群之間的相似度最小化。

非監督式學習也適用在一群資料項中辨識離群值 (outliers)。

非監督式學習的優點是不需要做訓練資料標記的工作,但它不能應用於所有狀況;使用非監督式學習,必須思考出與各群集相關的一些可用特徵。

人工神經網路藉由重複處理輸入訊號及生成輸出訊號來學習,這種迭代次數非常多,但不需要給予它們一組特徵才能進行處理,它們會自行找出特徵,這是它們學習過程的一部分。

但這就引出人工神經網路的一個潛在缺點:它們不解釋它們辨識了什麼「特徵」,因此也不對它們產生的結果做出解釋或理解;這也是必須審慎而不能盲目仰賴神經網路的原因之一。

深度學習在與電腦視覺有關的工作方面特別成功。

「強化學習 (reinforcement learning)」 是一種深度學習的形式,使用來自外部環境的反饋,持續改進自己的表現;它不需要訓練資料,因為環境會告訴它是否做對了或至少是往對的方向。

機器學習的問與答:

問: 這是你的機器學習系統? 答: 是的! 把資料倒進這一大堆線性代數裡,然後從另一邊取得答案。

問: 若答案是錯的呢? 答: 那就攪拌這堆資料,直到它們看起來是對的。

機器學習系統得出的答案可能「看起來是對的」,但這僅僅是因為它們反映了一開始用於訓練它們的資料。

訓練資料是人為的東西,有可能具有誤導作用。

沒有任何人工智慧或機器學習系統能夠做得比其訓練資料還要好,這類系統有很大的可能性只是確證了訓練資料本身固有的偏誤。

2022年11月2日 星期三

『軟體開發人員職涯發展手冊』開發副業專案 (side project)

終於來到這本書的尾聲;盡力完成一件事真的會變成一種「習慣」,也就是作者所說的「生活態度」。

這讓我想到以前看過的日本漫畫「我要高飛 (體操高手)」,裡面有提到所謂的「王牌」,並不是每次都能順利落地成功,而是盡全力「使完成」。

所謂的「使完成」就是想盡辦法做完整的動作,就算有瑕疵但最後還是能完成動作。

作者一直提到要扮演專案終結者,其實就是告訴我們透過這個方式,來培養「使完成」的習慣,進而形成自己的生活態度。

我自己也從做「副業專案」的過程中受益良多,本來不自律且容易幫自己找藉口放棄的壞習慣,在大學進行實務專題時,被磨礪了一番。

應該說人會變成今天的模樣,都是有種種的事件發生串連而成,而這當中的種種「選擇」造就今日的自己。

記得第一個完成的副業專案是實驗室的碩班學長出的一個小題目,我用當時熟悉的 VB 6.0 撰寫了有圖形介面的「彈力發射模擬系統」,其實這沒甚麼特殊意義,當時單純覺得好玩,順便讓自己熟悉程式語言跟 GUI 的設計。

但就是這個小專案,讓我從原先的軌道跳到另外一邊去,負責實驗室的教授看到我有程式設計的能力後,就讓我跟著他學習「機器視覺」的專案開發技術,這真是個巧合,讓人預料不到。

後來就陸續開發了很多副業專案及全國性的競賽,也親身經歷了這些專案「知識變現」的過程,那時候對於程式設計的熱情難以言喻。

這些過程帶給我的,並不是說技術變得高深莫測,現在回頭看當時的自己還只是個沒有太多專業知識的程式菜鳥,重點在於那個時候都「堅持把每個專案完成」,久而久之變成一種態度,也惠及我後續唸碩士班、博士班及創業的過程。

當我在演算法上無法突破想放棄、說好用英文撰寫碩論的目標快要無法達成、出國唸書語言檢定卡關、博士論文換題目覺得自己無法畢業、創業中遇到的種種困難與抉擇,以及幾年前決定在職去唸 MBA等,每一個事件都像是一個關卡在考驗著我的判斷與行動。

而在這些過程中,都還是有持續不間斷的副業專案,彷彿在告訴我「要堅持下去並想辦法完成它」。

現在講的很輕鬆,但大腦馬上聯想到會列出來的事件,都是當時我真的找了一堆藉口想要放棄的重大關卡,「我是真的想放棄」,但又有個信念支持我走下去。

因此非常認同作者所說副業專案的重要性,主要還是透過專案開發的過程,來塑造自身的生活態度以及相信自己能完成的信念,我也很喜歡「使完成」這個說法。

至於做一件事多目的,這部份我有相關經驗,不過遠不及作者所提的那麼廣泛;大致上還是一魚多吃,做能兼顧學術發表及技術授權或對未來創業有幫助的工作,這部份自己要事先規劃好並確認最終目標,過程中會有許多因素干擾,而這也會影響到最終目標的完成度。

我現在還是持續開發副業專案,有時候動手做反而能讓腦袋越來越靈活,但不得不說「成年人的時間管理」真的好難阿!


本章節重點摘要如下:

夢想是你追求的某件事,而目標是你要做的某件事

作者認為他先前 15 年的工作資歷對他的職涯和人生帶來的影響,還不如他當初完成的那個小型「副業專案 (side project)」來的大。

軟體開發人員提升職涯的最佳方法,毫無例外都是透過副業專案;一個小小的 Android 應用程式對作者的人生和職涯影響深遠。

一項為期六個月的副業專案,能讓你快速累積經驗,如果想從平常朝九晚五的工作中獲得這些經驗,可能要花上好幾年的時間。

為了實現目標,你要有具體的行動。

強力建議從非常小的專案開始,從一個你知道自己能輕鬆完成的小型副業專案開始,甚至是那種只花你數週或最多一個月時間的某件事。

第一次做副業專案時,最好先模仿某個已經存在的成品

作者擁護「多目的」,不過,多工就很糟,而且很難實現,最終只會降低你整體的生產力;多目的代表開發一個副業專案,但伴隨一個以上的目的。

作者舉例他這本書的「寫書副業」,每天花一小時的時間寫作,背負了以下幾項目的:

1. 維持每天寫一千字的習慣。

2. 產出一本書。

3. 銷售書籍,帶來額外收入。

4. 創造部落格內容。

5. 增加部落格註冊人數。


他還能夠過以下方法,進一步實現多目的:

1. 銷售本書的電子版。

2. 銷售本書的紙本版。

3. 銷售本書的有聲版。

4. 製作影片,將以上版本包裝成豪華加值版銷售。

5. 利用章節內容,產出 YouTube 影片。
 

想想看如何讓你的副業專案兼具多個目的:

1. 學習新的程式語言。

2. 學習新的框架。

3. 練習或精通現有的技能。

4. 開發應用程式,解決你遇到的問題。

5. 開發應用程式,解決他人遇到的問題。

6. 創造額外的收入。

7. 作為面試資料。

8. 作為部落格內容。

9. 將影片內容用於應用程式開發上。

10. 將專案用於指導他人。

11. 利用專案獲得他人的指導。

12. 提高自己的紀律。

13. 結交新朋友。

14. 了解你感興趣的產業。

15. 完成學院或大學作業。


動手做任何事前,重點是先規劃你要「做什麼」以及定義「最終目標」;請注意三項基本要素:

1. 目標或完成標準。

2. 完成期限。

3. 一套系統或設定時程表以推動專案。


良好的生產力系統是專案成功的關鍵,請確實做到以下幾點:

1. 清楚定義你每天或每週能投入多少時間在專案開發上。

2. 定義你何時要投入這段時間 (寫在行事曆上)。

3. 定義一套流程,用以追蹤你的「工作進度」和需要完成的「工作項目」。

堅持才能真正地完成專案,並從中獲益。這代表你要為副業專案的開發工作建立時程表,不論發生什麼事,你都會堅持時程表的進度。

所有的成功都來自於微小事物的累積與堅持

我們都曾經一頭熱地投入某些事,卻沒有走到最後;你要下定決心,不管是那個專案,即使你再討厭,一旦你起頭了,就一定要完成它。

除非真的打算完成一件事,否則就不會開始投入,這是一種「生活態度」。

推薦你找一些方法,從所有副業專案裡賺取收入,即使收入微薄也沒關係。

你不可能從副業專案裡賺第一桶金;但隨著時間累積,或許能從眾多副業專案中獲得大量收入。

重點是專案前期就要思考如何從中獲益。

所有的軟體開發人員手上都應該要有一些正在進行的副業專案;從小型專案做起,承諾時程然後完成。

「知道要做什麼」和「知道結果是什麼」兩者之間存在很大的差異。

我們都不知道最後的結果會如何,所以必須帶著我們所擁有的知識,盡全力去應用這些知識,然後「相信過程」;堅持不放棄,終究會有成功的一天。

拼續航力 → 從短跑衝刺變成馬拉松訓練

最近幾週我過上了極其規律的工作型態,因為在有時間壓力的情況下,有幾個新的產品功能待開發;但我又不想把自己的時間全壓上去,因此就每天專注工作三至四小時,確保當天都有達成設定的目標,也不特別著急著一次做完。 回頭一看,其實默默地都有完成當初預定的目標,似乎也沒有因為每天只專注開發三、...