只有累積,沒有奇蹟

2021年5月30日 星期日

[NETCore] ASP.NET Core 中加入 API 版本控制

前言
在開發 API 時可能會因為代碼調整或是架構的演進,相同的 API 接口可能會有新的版本出現,為了不影響舊的呼叫端程式邏輯運作,就需要在代碼中加上新舊版本的對應來解決 API 版本問題,或許為了解決 API 版本問題可以有很多種不同的解法,在 ASP.NET Core 中可以透過  Microsoft.AspNetCore.Mvc.Versioning  來解決此問題,這篇就來分享一下有關Microsoft.AspNetCore.Mvc.Versioning 套件的安裝與基本使用,若有問題或是錯誤的地方歡迎網路的高手大大給予指導

安裝
首先直接透過專案的代碼可以方便大家可以更快的了解,起手式先建立一個 ASP.NET Core API 專案來作示範
建立完專案之後第一步是開啟開啟 Nuget Package Mnage 輸入 Microsoft.AspNetCore.Mvc.Versioning  搜尋,安裝目前最新版的套件
或是透過 Nuget Package Console 輸入下列指令
Install-Package Microsoft.AspNetCore.Mvc.Versioning
安裝完畢之後到專案檔底下確認是否有安裝成功
<ItemGroup>    
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="3.1.3" />    
</ItemGroup>

設定 
接著開啟專案中 Startup.cs 的 ConfigureServices 加上下列代碼
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddApiVersioning(o => {
        o.ReportApiVersions = true;
        o.AssumeDefaultVersionWhenUnspecified = true;
        o.DefaultApiVersion = new ApiVersion(1, 0);
    });
}
簡單說明一下設定所代表的含意及意義

ReportApiVersions

支援在 API Response Header 中加入 API 支援的版本,讓呼叫端知道目前版本有哪些,舉例來說開啟設定後如下,可以看到目前 API 支援的版本有 1.0 及 2.0 兩種版本

AssumeDefaultVersionWhenUnspecified
當發送的請求未指定 api-version 版本號時,是否需要啟用預設版本號。如果設定為 false 也未指定版本耗時則會出現錯誤訊息 An API version is required, but was not specified.

DefaultApiVersion
預設 API 版本號碼

使用 URL Querystring 指定版本
在此框架中使用  ApiVersion  來區分不同版本 API,接著為了要測試不同版本 API 回傳與設定,在 Controller 中加入下列代碼來驗證
using Microsoft.AspNetCore.Mvc;

namespace NetCoreWebAPIVersion.Controllers
{
    [ApiController]
    [ApiVersion("1.0")]
    [Route("api/[controller]")]
    public class ValuesController : ControllerBase
    {
        [HttpGet]
        public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
    }

    [ApiController]
    [ApiVersion("2.0")]
    [Route("api/values")]
    public class Values2Controller : ControllerBase
    {
        [HttpGet]
        public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
    }
}
當未指定 API 版本時候,會參考稍早在 startup 中的 AssumeDefaultVersionWhenUnspecified 與 DefaultApiVersion 設定,在此範例中預設為 1.0 版因此可以看到回傳 version 為 1.0

透過上列代碼,可以在 url 帶入 api-version 參數來指定版本,舉例來說要指定版本為 2.0 則帶入 localhost/api/values?api-version=2.0 

使用 URL Route 指定版本 
也支援使用 Route 指定版本號,可以在 Route 加上  Route("api/v{version:api-version}/[controller]  ,根據上述調整做些微調如下
namespace NetCoreWebAPIVersion.ControllersV2
{
    [ApiController]
    [ApiVersion("1.0")]
    [Route("api/v{version:apiVersion}/[controller]")]
    public class ValuesController : ControllerBase
    {
        [HttpGet]
        public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
    }

    [ApiController]
    [ApiVersion("2.0")]
    [Route("api/v{version:apiVersion}/values")]
    public class Values2Controller : ControllerBase
    {
        [HttpGet]
        public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
    }
}
使用方式就很簡單,指定 1.0 版本
指定 2.0 版本  
如果需求情境是希望版號加在 Header 中,讓 url 避免透漏過多資訊也乾淨些,則可以在 service 中使用  HeaderApiVersionReader 進行設定,詳細可以參考官網說明。

設定過期 (棄用) 版本
在某些情境下可能早期的 API 版本將不在支援,在此框架中就可以透過設定 Deprecated  讓使用端知道,
舉例來說,下列代碼在 controller 一共有 0.1、1.0以及 2.0 三個版本,其中設定 0.1 版將不在支援,因此在 ApiVersion 中定義 Deprecated = true
namespace NetCoreWebAPIVersion.ControllersV2
{
    [ApiController]
    [ApiVersion("0.1", Deprecated =true)]
    [Route("api/v{version:apiVersion}/[controller]")]
    public class Values3Controller : ControllerBase
    {
        [HttpGet]
        public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
    }

    [ApiController]
    [ApiVersion("1.0")]
    [Route("api/v{version:apiVersion}/[controller]")]
    public class ValuesController : ControllerBase
    {
        [HttpGet]
        public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
    }

    [ApiController]
    [ApiVersion("2.0")]
    [Route("api/v{version:apiVersion}/values")]
    public class Values2Controller : ControllerBase
    {
        [HttpGet]
        public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
    }
}
在呼叫 API 的 Response Header 中就可以看到目前支援版本為 1.0 與 2.0 兩種,版本 0.1 已過期

不限版本
在一些通用的 API 接口是不需要受到版號設定的,例如 Health Check 等資訊,硬是加上版號會讓人使用上更為不便,在此情境可以加上  ApiVersionNeurtal  屬性達到效果,並從 API 版本控制中移除
[ApiVersionNeutral]
[Route("api/[controller]")]
[ApiController]
public class HealthCheckController : ControllerBase
{
    public string Get() => "OK";
}

感想
透過以上說明相信對於ASP.NET Core WebApi Version 設定與應用有基本了解,在微軟 GitHub 官方 aspnet-api-versioning 也提供 sample code 範例給開發者了解,也可以發現版本控管框架不只支援 ASP.NET Core 也支援 .NET Framework WebAPI,如果對於細節或是應用想了解更多的話,不坊可以到 GitHub 可以看到更多有興趣的項目,希望這篇介紹可以有幫助到有需要的朋友 :)
Sample Code Path : sampleCode/NETCoreWebAPIVersioning

參考
aspnet-api-versioning
API Versioning in ASP.net Core
ASP.NET Core Web API Versioning 的做法

2021年5月19日 星期三

[CheatSheet] Datastore Choices

前言 
最近這份工作開始接觸到雲端 AWS 的服務,在使用服務之前都必須要了解的是服務的特性與其限制,因為當使用到不對的服務時除了浪費時間與公司成本外,還會有額外產生的費用問題,因此在選擇上更需要格外小心,最近在逛 facebook 社群朋友們廣傳一張實用的 cloud service Datastore choice 圖,可以協助你在不同的 base 底下選擇資料儲存服務的困擾,看完覺得收穫良多特記錄在部落格中,做為自己備份也提供給有需要的朋友
參考 
scgupta.link

2021年3月22日 星期一

[筆記] 商業思維學院 - 學習永動機

前言
在上一堂 商業思維學院 - 技術工作者的商業思維 91 分享了技術人的商業思維與自己職涯的發展過程,自己在 fb 社團不要臉的分享了課程心得後,有幸參與到線下主題講座「學習永動機」,在一開始 91 透過淺顯易懂的方式讓大家了解主題背後的涵義。大家都知道飛機是萊特兄弟發明的,某天第一次看到飛機在天空飛的人問萊特兄弟,「為甚麼飛機能在天上飛 ?」 萊特兄弟回答因為飛機沒空掉下來。這跟學習一樣,要怎麼樣一直持續的學習才能進步。接著在詢問大家「知道複利是甚麼嗎 ?」,簡單來說就是本金投資,獲利後在投資在本金。這東西就像永動機一樣,是個持續的循環。這一場主要圍討論內容如下
目標正向迴圈
如何學習
如何變強
在這場分享中 91 透過因果迴路圖 CLD (Causal Loop Diagram) 向參加的同學說明其因果關係,以下圖片為小弟聽完整場分享後整理的懶人包
3/24 更新懶人包內容,感謝 91 給予建議與回饋與建議 :)

目標正向迴圈 CLD
首先要定義一個學習目標,每個人的目標會有所不同,可能是為了鑽取更多的錢,可能是讓自己有成就感,也可能會是快樂 在場同學都很直接地提到是為了賺錢;舉例來說你的目標年收入可能是 200w,目前的年收入是 100 萬,這之間的 gap 就是目標與實際(收入)的差異, 要如何彌補這之間的差異,可能行動計畫會是規劃額外的工作量來達到,額外的工作不會平白無故地自己被完成,因此需要額外的工作時間來處理 需要投入更多的時間來消化,可能會利用下班時間來處理額外的工作,才有機會達到你的目標,每個人時間都是固定的每天都只有24小時, 如果做一件事情要花兩個月才能完成,在一年內完成的比例就會降低,實際完成的工作成果就會相對變少,因此實際增加的年收入也會受影響(少) 最後實際增加的年收也不會變少,無法達到自己所訂定的目標,
反思 : 為甚麼沒有辦法增加年收入? 
有沒有辦法降低與目標的差異 ? 時間是最大的限制之一,也可以回想一下為什麼工作要花那麼多的時間 ? 可能會是工作流程有浪費或是工作效率沒有那麼好 如果有 run Scrum 應該有聽過 retro 的事件,在專案結束會有 After Action Review(AAR) 或是定期進行個人的復盤,提高自己或是團隊整體的效率,

切入點 : 額外的工作時間
首先,可以從需要額外的工作時間切入,思考自己在這方面可以調整甚麼或是做甚麼,如果在進行需要額外的工作花費的時間越多時,你可以在工作外可支配的時間就用少,舉例來說,當你把時間全部投入在工作上,會導致工作以外的時間變少,那麼可能會在這死循環繞不出來,上班被榨乾,下班只想放空滑手機耍廢;如果可以撥出 10% 的時間,進行改善效率的活動,例如進行個人的復盤思考如何改善/提升自己、AAR、RETRO,上課或是參加 Meetup 講座,改善工作效率的活動越多,也更有機會提高工作效率,當工作效率提高,完成單一工作所需要的時間也會變少,總共需要的額外的工作時間也會變少,舉例 : 本來有三個工作要進行,需要額外的工作時間是八個小時,提高效率後現在只要兩小時就可以完成,總共需要的時間就會變少。
反思 : 如果你是一位伐木工,你的斧頭多久沒有磨了 ?

切入點 : 增加工作效率
使用工具主要目的是為了提升工作效率,在初期可以使用免費的工具,當隨著迴圈不斷變大年收入開始變多時,可以選擇付費的工具節省更多的時間 找到合適你工作或是學習的工具及服務,就可以開始啟動這增強迴圈。91 分享在他工程師階段時期,他會思考如何找到免費的工具在每個月賺500美金; CTO 會花費1W在工具來賺10W美金,這就是他與 CTO 最大的差異。這些道理大家一定都知道,但差在個人願不願意花錢買工具剩下時間造成正向迴路, 是現場有很多朋友寫 C# 的,可能都聽過 Jetbrains,大家一聽到 Jetbrains 可能覺得工具很貴像是 Rider 一年要 139 美金, 但有沒有想過 139 美金換算下來可能比一天一咖啡還便宜,更不要說工具替你省下的時間與帶來的價值。這裡讓我想到搶救婚姻三機, 洗碗機、掃地機器人、烘衣機,家事少了,家庭更和睦了(大誤
當工作效率提升到一定程度以及也使用工具來節省時間,那麼還有甚麼可以調整的呢 ? 
切入點 : 提升額外工作量的產值
提升額外工作量的產值(價值),也就是花同樣時間做完更有價值的工作,可以賺到一樣的錢需要的時間也會跟著變少,也就是上次 91 分享的內容, 在工作外的時間嘗試高變現與綜效,像是參加社群建立連結,撰寫部落格賺取廣告等工作之外的事變現,

透過以上說明,希望大家可以了解其中的因果關係,另外也提醒大家當踏出第一步某個迴圈轉起來後,將所賺到的利息在投進去本金滾 而不是把利息花掉,那麼後面可以做的事情就會越來越多,這樣正向迴圈就會越來越大。


學習
IPO 模型 > Input Process Output
首先學習會先有輸入 ,學(輸入)的東西越多,可以輸出的東西也就越多,再透過反饋讓自己更進步,就像 91 在極速開發課程中常提到的一個重要觀念, 你快不起來是因為不覺得自己慢;沒有學到東西是覺得自己已經會了,就不會額外再學習更多東西; 輸入的來源分為兩部分,知道自己不知道什麼(知不知)跟知道自己不足甚麼(知不足)。
輸出部分,如果將學到的東西輸出到社群,可以得到 feedback (失敗也是一種 feedback)就可以學到更多東西; 另外也可以透過 Mentor 得到更多 feedback。
知不知 : 要知道自己不知道甚麼東西是很困難的,大部分的人處在自己不知道什麼東西,要靠外在的輔助,例如 透過 pair program 寫程式,從跟你 pair 的人得到自己原本不知道的東西 透過看書,了解更多基本知識或是成功者的經驗會是什麼 透過參加研討會,學習到改善流程上的好方法
反思 : 在學習的過程中,怎麼知道自己不知道什麼 ? 怎麼把不知道的事情變知道 ? 怎麼把做錯的事情做對 ? 怎麼把做完的東西做好 ?

個人補充
在聽到知不知讓我想起在前公司 T 社聽到的觀點有點類似,可以透過不同等級定義來了解的程度,我常應用在面試時與面試者確認技術是否熟悉
舉例來說團隊在 cache 的解決方案會使用 Redis,我會想了解面試者過去的經驗中 cache 用過哪種
如果面試者回答沒聽過,我會定義在不知道,不會用 (I don't know , I don't know)
如果面試者回答聽過,或是在文章上看過但沒實際使用過,我會定義在知道(聽過),但不會用 I know , I don't know
如果面試者回答使用過,就會透過更多問題來釐清其(I know , I know) 理解程度
請面試者與我們分享 Redis 提供哪幾種資料型態,分別使用的情境是什麼 ?
如果有說明出來,會再了解過去使用哪些資料型態 ? 為什麼要這樣用,在使用上有哪些限制是要注意的 ? 當 Redis 掛掉了怎麼辦
透過這些問題了解他熟悉程度,來定義是屬於略懂還是真的有經驗。

自己在學有興趣的事情時也會用類似的衡量標準,來看自己是否真的對於該技術是熟悉的 ( review 發現自己其實會的很少 XDDD)


學習階段
資訊的來源是資料,透過蒐集與過濾將資料轉化為有用的資訊;在透過系統化的整理將資訊整理為自己的知識 像是學院交流社團中很多同學會把上課內容內化,嘗試用自己理解的方式整理為筆記或是一張圖,這就是一個很好的過程; 知識變為技能這一塊就是大家需要加強的一塊,要持續的練習與應用在實務上,而且要持續改善才有機會轉為技能。技能沒有轉化為價值是很可惜的 就像是兩周的 sprint 完成後市場不買單是一樣的道理,因為產出內容並沒有對市場帶來價值,才會得到市場或是客戶的 feedback。 91 分享他在看書時不會一次看完整本,會看完一段時停下來思考如何與自己的技能做連結,開始嘗試動手做些東西得到 feedback;就像過去瀑布是開發可能 就像過去瀑布是開發專案可能規劃兩年完成,開發了第三個功能後發現市場不買單,如果可以選擇不做什麼,通常價值比你要做什麼來的高(減法)。
如何獲取資料源呢 ? 
有些人可能會 follow 大神的 twitter,這好處是他們會將資料整理成資訊,這樣可以省下你過濾的時間; 可能會追蹤特定人士的 twitter 或是訂閱 RSS;訂閱喜歡領域的電子報或是 InfoQ 文章;91 分享自己想要學新領域的知識時, 會先看朋友中有沒有人是這領域的專業;或是找該領域社團是否有管理員或是活躍人士,尋找適合當你 Mentor 的人, 下一步會試著整理資訊
  • 為什麼想要學這些東西
  • 自己的背景
  • 目的是什麼
  • 目前對該領域了解程度
說明以上資訊後接著會請大家推薦三本書給我,或是了解該領域的經典書有哪幾本,透過書系統化的整理後可以針對有興趣的章節作深入研究, 接著在將學習到的東西輸出到社群,不輸出就不會有 feedback 就不會知道自己是不是對的。

如何變強持續改善 (CLD)
91 分享透過幾個維度怎麼樣思考與發現自己不足的地方,這裡也使用系統圖來做說明

B1 : 變強最簡單的方式就是接受挑戰,怎麼樣持續變強就是永遠挑比自己能力多一點的挑戰; 有了挑戰就會有想要改善的驅動力,驅動力越強改善效果越好,在這過程中能力也會因此提升,可以迎接下一個更難的挑戰。 這與 遠離舒適圈 by 何飛鵬提到的觀念不謀而合。這是第一個正向循環。

R1 (速度): 下一個可以試著挑戰{完成工作需要的時間}變少,同樣一件事情原本可能需要一小時,挑戰能否在40分鐘內完成;完成工作所需要的時間越短, 挑戰越大,就需要更大的改善;當你完成這項挑戰也就代表自己變強了,可以在預期的時間內內完成,可以在挑戰是否可以再更快完成, 這個迴圈主要的挑戰是速度,在已知的知識裡增加熟練度,可以透過練習或是使用工具來達成。

R2 (技能深度): 解決問題的難度越高,挑戰也就越大。改善之後可以解決問題的難度就可以再增加,就可以解決越來越難的問題。 這個迴圈主要的挑戰是技能的深度,舉例來說,像是可能很多企業都在做晶片,但沒有辦法像台積電做得那麼小;這幾年大家都在研究電池,但沒有辦法做得像特斯拉那麼好;

R3 (廣度): 跨領域,要怎麼跨領域的幫助與工作有交集的人,跨的領域越多挑戰就越會大。這個迴圈主要的挑戰是廣度。

R4 (品質): 當你完成任務品質越好,挑戰也就越大。這個迴圈主要的挑戰是做事的態度,舉例來說,當你想到小籠包會立刻想到鼎泰豐,相信很多文章報導都有提到過鼎泰豐對於品質的要求, 連續五年獲得米其林一星,一樣的小籠包可能價格上就是比別間貴一些,當你在品質上做出成果,就不用在價格上跟別人比價與CP值。 當你去面試的時候,當你的能力與另外一位候選人差不多(錢也差不多),你的個人品牌就可能是另一個可以拿來比較的基準。怎麼樣把一個東西做到又快又好,這屆是一個很大的挑戰>

R5 (責任): 責任越大,挑戰就越大,當可以扛的責任越大,所需要具備的技能可能就越多。這個迴圈主要的挑戰是影響力跟信任, 這兩點是最難也是最值錢的;91 也分享他的技術課程為什麼那麼貴還是被秒殺,是因為大家相信他上課的品質是業界最好的。

透過這樣子的持續改善讓自己越來越強,而且改善這條路是沒有終點的。


影片分享 & 火力展示
影片 : 學習永動機 - CLD 簡介核心概念
影片 : 日本最速仕事人,在自己的工作領域上處理單一工作的時間改善極緻後的影片
影片 : F1換輪胎
https://www.bilibili.com/video/av37657177/
Tool : wox
類似 Mac 的Spotlight search功能,透過一個簡單的視窗快速找到檔案&應用程式,可以節省自己找檔案的時間。 可以想像一下,當你要搜尋筆電中 D 槽個人資料夾的特定 folder,流程可能是開啟我的電腦 > 選擇硬碟 D > 點選個人資料夾 > 點選特定 folder > 找到檔案 透過一個軟體可以省下找檔案的時間與步驟(至少五步)
2019 學習 Trello
Tool : Add To Trello


心得
這次線下課程結束後的大合照
    參加過 91 培訓課程的人都可以輕易地感受到講師的熱血魂,這種熱血的程度與線上課程相比感受是很不一樣的,這一場主要圍繞著「學習」出發。在第一個 Session 透過 CLD 以系統化的方式來分析設定目標後達不到的主要原因,從中找到可以改善關鍵點與讓"正向"迴圈越變越大的方向;接著再透過 IPO 模型分享學習的觀念與階段,這一段自己在聽的時候感受蠻深的,有些同事或朋友在聊天時常提到自己想要技術變厲害變強,但自己卻沒有太多行動計畫,或是期待自己上完課或是參加完研討會後"好像"就會某個技能了(睡夢羅漢拳?);透過 91 在本次的分享,不僅僅可學習到他是學習一個新知識(技術)的過程,從輸入到輸出在收集 feedback 的學習正向循環,更重要的是還可以檢視學習上還有什麼可以精進與調整的地方,這也是自己參加這堂課最大的收穫 :)。

如果你對商業思維學院有興趣,可以點選 >>>> 這裡


2021年2月20日 星期六

[筆記] 商業思維學院 - 技術工作者的商業思維 課程心得

前言
在 2020 年底報名了由 Gipi 創辦的 商業思維學院 課程,希望自己不管是在管理或是視野上可以有所提升,在 2021.1月參加學院中技術工作者的商業思維主題講座筆記,Gipi 院長邀請好朋友 91 分享技術工作者如何創造商業思維,討論內容如下
技術人的商業思維
職涯發展與相關技能養成
如何有效學習(輸入),並產生商業價值(輸出)
這篇是根據該主題講座整理的筆記,整個簡報分為三部分
  • Job (大事記) : 職涯在那些公司服務過,為甚麼會選擇這些工作,在這份工作擔任什麼樣的職務跟角色? 。
  • Work (創造連結) : 在這些工作之外做了甚麼樣額外的嘗試 ? 例如出書、講課、社群活動。
  • Career (技術變現) : 這些事情如何影響我職涯的選擇。
每個人的職涯路線可能不一樣,透過分享可以讓聽到的人有一些不一樣的想法,可以學到對自己有幫助的部分。以下圖片為小弟聽完整場分享後整理的懶人包

大事記
所做的每一件事情,分享在當時的 context 底下為什麼會做出這樣的決定,與決定背後考量因素有那些,如何達到自己所設定的目標
  • 叡揚 : 基本功,奠下基礎 2009 MVP Start
  • Yahoo : 對做交易型系統最有興趣,像是電商或是銀行;評估 > 職涯剛開始,未來發展最廣,文化 open (雖然薪水最低,視野會放到 global
  • 東森信息 : 前面兩份工作累積的技能與能量,都在這份工作有機會發揮也有很多導入跟改變的機會,艱鉅的挑戰也相對大
  • Odd-e : 喜歡 training 與顧問,先從自己熱愛的事情出發並想辦法變現 (商業思維),給自己一年的時間嘗試看看養不養的活自己,嘗試之後看起來活的還不錯

創造連結
在工作以外的部分 91 也做了蠻多有趣的嘗試,在業界比較獨特與不可取代性的競爭優勢可以用一句話行形容
91 = Agile x Dev (敏捷搭配開發)
  • 社群是寶貴資源與優質連結的所在地,並將所學到的知識回饋給社群;
  • 並持續地從2008年開始將技術知識整理成文章放在點部落至今,透過參加鐵人賽撰寫技術系列文強迫自己成長
  • 成立 FB 粉絲專業,將看到有興趣的題目分享自己的觀點與想法,如果討論串內容是有大家有興趣的會在整理成技術文章

技術變現
從 YAHOO 開始進行一些嘗試,從書籍的校稿到在 Modern Web 擔任講師,以及在 Skilltree 開始授課,在 YAHOO 的第二年 52 周每周都會在公司內部 host 一場教育訓練,也透過這個嘗試讓自己知道很適合做教育訓練 (天職),從內部的教育訓練到在 meeting up 擔任講師,再到公開課程的教育訓練,這些嘗試都是由淺到深有相關聯,可以持續累積能量到大幅變線的部分,到後來有機會加入 Odd-e 團隊並開始決定自己出來做,擔任多間公司顧問與公開培訓的課程。

職涯成長
從 JOB > WORK > CAREER > Value 是什麼 才變演變成現在的 91

JOB
  • 時間最貴 :
    • 節省老闆的時間 : 老闆的薪水是最貴的,他的一分鐘成本跟你的一分鐘公司付出成本差多少,如果可以讓老闆節省這些時間,就是替公司賺錢;同時也可以證明你有能力做這些事情,老闆不用花這些時間在你身上,他也可以去做更重要的事情。
    • 節省團隊的時間 : 舉例來說團隊中有十個成員,你如果可以做一些事情來節省團隊的時間,這樣就有9份的戰力,也就是提供9倍的價值
    • 用時間賺時間 : 時間是用錢買不到的,怎麼樣讓自己有更多的時間,像是自動化、買工具、上課進修技能的提升
  • 角色 : 技術人員不管在公司擔任什麼腳色,都不要被公司綁死。要持續的接觸外面的世界,因為外面的世界(技術)變化得很快,因此 91 在選擇工作時重視的是公司是否鼓勵員工進修,在學習後再回饋給公司讓團隊更強
  • 溝通 : 不管在哪份工作或是擔任甚麼職位,與主管的溝通是即時且透明的,會在問題發生的第一 時間告知主管,拆解問題並提供合適的解決方案來解決。並且持續同步主管的期望與自己的成果,否則做得再好主管也不知道(Value First)

Work
很多事情都要嘗試過才知道什麼是真愛,就像小朋友一樣會讓他上很多才藝班目的就是為了讓他找到喜歡的東西(事物),當找到幾個有愛的領域可以嘗試將他產生綜效進行變現,91 舉自己作為例子,一開始是從開發程式語言(C#)奠定基礎,喜歡架構設計與教育訓練可以在團隊中擔任 Team Lead 或 Tech Lead 帶團隊前進,對敏捷開發與極限編成有興趣,這些面向就是市場最需要的各種角色。有些人只知道理論沒有太多實務經驗,可能沒有辦法將想法落地;或是有這些實務經驗但不太會教人(培訓),怎麼樣讓自己有不可取代性與價值,這也是綜效與變現很重要的一點。

Career
  • 選擇 : 91 也分享在選擇工作時自己會看重的是成長 > 績效,原因是成長是伴隨著職涯(Career)走,績效是跟著 Job 走,很多 KPI 跟 Goal 可能是公司的目標但不一定可以對個人成長帶來幫助,例如將 SVN 換成 GIT,可能是公司的目標但不一定可以為自己帶來持續累積的能量與學到東西 (雜事)。為了不要為 KPI 工作,在挑下一份工作時會選擇三年內都不加薪也願意去,因為選擇的工作有想學的東西,再談薪水時會把三年內要加薪的幅度都灌進去,從不同的角度看在下一份工作自己還缺少什麼,哪裡需要加強與精進的地方,而不是為了 KPI 是為了自己職涯而工作。
  • 目標 : 建議在選擇工作時怎麼樣突破職涯薪水的天花板,而不是只看當下那一份工作的收入,在每一份工作做的選擇跟嘗試跟投資自己都是重要
  • 權威 : 用成果來描述你自己,成果是所有職涯的累積(JOB + WORK),持續地的用 JOB 與 WORK 輸出成果,讓你不用講別人也知道你的能力、工作態度、擅長的領域與可以解決甚麼樣的問題,當你今天想換個跑道時,就會有人(老闆)主動的跟你接洽談希望你解決新公司甚麼樣的問題,可能只是簡單吃個飯省去 interview 的過程不用準備履歷,把準備履歷 push 的形式換成 pull 省下準備履歷的時間,技術能力基本上是一翻兩瞪眼,成果就是最好的履歷,另外也是要看戰功、口碑與可信的推薦。
Value
  • 初心 : 擇己所愛,不要忘記自己的初衷
  • 人脈 : 一句話來說就是可以幫上多少人。如果其他人有問題,自己有沒有能力可以幫助別人,與學員與企業客戶建立連結,並透過觀察與分析市場來得知那些公司有問題。
  • 自由 : 當你是權威,就可以做自己 不委屈

職涯覆盤
這一 part 主要目的是希望聽完這兩小時的分享後,盤點自己有哪些地方可以額外創造商業價值,真正喜歡的東西是什麼以及如何變現 ? 變現的部分不一定是錢,可能是對工作有累加的幫助、可能是影響力…etc,希望的是聽完後從自己出發做技能盤點,在這邊 91 列了幾個問題希望我們可以思考一下
我目前用來創造商業價值的主要依據為何?
我真正感到熱愛的技能、工作、喜好、專業是哪些?
如何從我熱愛的領域變現或創造商業價值?
誰會需要這樣的商業價值?為什麼要選擇我?
哪些熱愛的領域交集,能產生綜效或獨特商業價值?
還有哪些需求或商機,需要哪些領域交集才能達成?
如何養成能解決別人問題的能力,並讓人知道?
怎麼發現他人有這樣的需求與問題?
怎麼讓他們願意選擇我,接受我的幫助?
經過今天的課程分享之後學員們如何提高自己曝光的管道,可能是 blog、facebook,也要思考在曝光時自己跟別人相比,可以有哪一些不一樣的地方;在建立連結時可以從哪裡地方或角度著手;嘗試去變現

個人的職涯覆盤 (2021.2.23 更新)
Q : 我目前用來創造商業價值的主要依據為何?
實現 PM 與需求單位提出的需求
建置技術團隊
規劃與導入合適的流程與規範
優化既有產品架構與技術問題
Q : 我真正感到熱愛的技能、工作、喜好、專業是哪些?
喜歡將技術實現並解決問題的過程
將研究新技術或上課內容整理成技術文章
研究高流量與高併發架構設計
Q : 如何從我熱愛的領域變現或創造商業價值?
持續的輸出技術文章,對自己要求文章品質提高自己能力
參與外部技術社群與課程,吸收消化後帶給 Team Member
Q : 誰會需要這樣的商業價值?為什麼要選擇我?
透過文章內容與解決問題的分析過程,讓公司或同事知道自己具備解決問題的能力
想要創造願意分享氛圍的(未來)團隊
Q : 哪些熱愛的領域交集,能產生綜效或獨特商業價值?
利用自己過去的開發經驗(10y+),與擔任過不同的角色(SA + PM),當遇到問題時可以用更多角度來思考並提出解決方案
Q : 還有哪些需求或商機,需要哪些領域交集才能達成?
Cloud Service & Arch Design : 隨著雲端服務技術逐漸的成熟,雲端化在未來可能會是一個趨勢,學習或其中一個雲端解決方案的基本知識,與在雲端上設計 Application 要注意那些細節是個重要的環節
容器化 : 應用程式容器化(dockerize)
Q : 如何養成能解決別人問題的能力,並讓人知道?
要有解決問題與識別(釐清)問題的能力,才可以有效並正確的解決別人的問題。
讓人知道可以透過技術部落格的分享、IT 鐵人賽分享系列文章,或是在 fb 技術社團、技術的 LINE 群組、公司同事在每天 Daily 報告時觀察別人遇到什麼問題,這些雷是否有踩過,自己是否有能力可以協助幫忙並提供好的解決方案。
Q : 怎麼發現他人有這樣的需求與問題?
在技術論壇或是社群看有那些常見的問題,這些問題是否容易被解決
Q : 怎麼讓他們願意選擇我,接受我的幫助?
加強自己解決問題的能力、建立良好的形象與人脈的建立
曝光部分自己過去有做過一些小嘗試,將部落格中的文章與 Sample Code 系統與結構性的整理成電子書放在 Github 上,提供有需要或是剛入門的人下載與增加連結,雖然測試結果後效果普普(28 stars) 但整理的過程自己覺得挺好玩的。

推薦書籍
最後也分享一些覺得不錯的書(跟工作無關),推薦給大家
  • 做個有梗的人 : 怎麼樣做嘗試
  • 低谷 : 自由工作者 怎麼樣在市場生存下來,有幫助
  • 刻意練習 、點子都是偷來的 : 與學習比較相關
  • 動機 : 在團隊要推行一些改革,ex : 導入敏捷、單元測試,可以參考這本書
  • 學生為什麼不喜歡上學 : 裡面有些學習的理論。適合想當 training 的人參考


心得
    自己在新手村時從點部落的文章知道 91 大神,之後都陸續有在 follow 91 的文章與粉專,從文章或過去交流過程大多都是以技術的角度出發進行深入的討論,在這次主題中與過去不一樣的 91分享自己職涯中工作時遇到的挑戰,或是工作外進行了甚麼樣的嘗試與機會,以及不同階段設定的目標與其背後的目的,接著在技術領域有系統、有目的性的持續輸出,累積自己的成果與影響力並嘗試創造不同的連結,將其成果變現的過程。在兩個半小時的精彩分享中,學到很多不一樣的觀點與啟發,尤其是不為 KPI 為自己的職涯發展做事的想法,讓我有很深的感觸。
    「想成為大神,必須知道他們腦袋在想甚麼」,思考自己與業界成功人士想法上的差異,透過學習與模仿方式找到適合自己的方法,就像灌籃高手裡面的兩萬球特訓一樣(好宅),安西教練向櫻木說「你應該好好看著流川的姿勢,盡可能的模仿他,然後用3倍的訓練量練習,才有可能超越他。」,突破自己目前的天花板達到下一個境界,幫助到更多需要幫助的人。
    在最後的 Q&A 階段 91 也毫不保留的解答學員所提出的問題,擔任主持人的 Gipi 也會提出自己的觀點與看法,兩位(Gipix91)擔任多間企業的顧問都有相當豐富的實戰經驗輪流回答問題,這些可能都是在外面少有的機會(有的話也是不便宜...),自己覺得相當的值回票價 ! 也許願學院之後可以有更多機會參加類似的主題講座,可以學到(偷學)到更多不一樣的觀點與知識。

如果你對商業思維學院有興趣,可以點選 >>>> 這裡



Q&A
Q : 會建議目前只專注在.Net的開發者跨出去嗎?或者會建議持續深耕在.Net?
Q : 看 91 在 FB 上提到去客戶公司支援的故事,都可以快速的經由與員工溝通中就知道該如何執行,這是如何掌握這方面的訊息與支援要處理的問題?

2020年10月3日 星期六

[筆記] 《知行》: 技術人的管理之路

前言
這一篇是紀錄閱讀 《知行》: 技術人的管理之路 的讀書筆記,這本書是參加 TGONetwork 所舉辦的 TGONext - TGONetworks 導師計畫 成果發表會導師 Taien 所贈送的,能夠拿到導師所贈送的書自己也有點意外(當天上台分享時蠻掉漆 XD)。這半年來工作上寫 Code 的時間越來越少花很多時間都在與團隊同仁溝通,在規劃新項目或是簡報時不是那麼的流暢(得心應手)似乎總覺得少了什麼,因此決定靜下心來好好的把導師所贈送的書了解一番,才不會枉對導師對我的期待(自以為?)。這篇文章僅介紹第一章節 : 管理路口的徬徨,整理可能當開發者要轉換成技術管理職可能會遇到的一些問題,其中若是自己有理解不正確的地方是錯誤的部分歡迎各位管理大神一同討論或給予指導

工程師發展路徑
在書的一開始,作者提到過去有一群從 2005 年開始工作的工程師好友們,在某次聚會中整理這些好友目前的職務可以分為幾大類 (作者為大陸人,書中內容可能會因為場景或是地區不同有所差異)
技術類 : 架構師、技術專家
管理類 : 技術管理者、職業經理人
創業類 : 創辦人、技術合作者
顧問類 : 投資顧問、管理顧問
可能隨著能力的提升可以做的事情越來越多,提升架構能力後轉為架構師;或是專案管理及帶團隊能力越來越強,逐漸轉為技術管理者;有很好的想法想要做自己的一番事業,成為創業公司的技術合夥人;書中提到特點之一是 10 年後堅持做技術比例的只剩 20% 左右 (沒有一定,最自己而言做自己最喜歡與認同的角色即可)。不管是走上述哪一條路,有些基本能力可能會是通用的,像是規劃、帶人、管理、溝通及執行能力,也可以說是環繞著技術與管理這兩條路在走,只是不同職務所面臨與擔負的責任不同。

我到底要不要做管理
作者常常被工程師問到我適不適合做管理?您對我有甚麼建議,作者則會反問工程師幾個問題
做管理對您來說意味什麼? 您覺得它能給您帶來什麼
希望可以透過此問題來讓提問者去了解到做管理的初衷,而非直接透過回答的方式取得答案;如何審視管理對您來說是不是真愛呢,可以透過三個問題幫自己做判斷
您是否認同做管理的價值 ? 
您是否對管理充滿熱情 ? 並享受這些工作呢 
您是否看中在管理方面的成長呢 ?
管理與技術的挑戰不一樣,常常會需要接觸很多雜事像是面試、團隊溝通、規劃流程、與主管匯報、資源協調與績效評估等各式各樣的管理工作,與開發工作相較之下項目較多且較為雜亂,可能也很難從中獲得成就感與價值,如果不認為管理是有價值的可能較難持久下去,可能會有覺得寫代碼較為單純的念頭出現。但從另一個角度來思考,過去在開發可能只要做好主管交辦的項目即可,但轉做管理為了要帶領整個團隊前進,就須思考上級、同一層單位、下級各方面的期待與訴求,要求自己用更全面的角度來思考問題的解決方式,這些挑戰也會替您帶來成長,成就感與影響力。

我要不要轉回去做技術
俗語說《人窮則反本》,當人們遇到挫折就會想回到老路上。作者提到在訪談的 2/3 的新技術經理,都有類似的擔心跟問題,問題像是做了管理之後沒時間寫Code,覺得離本行越來越遠;不知道在管理與技術中如何取得平衡,兩者兼顧;管理工作瑣碎,技術越來越少接觸覺得心虛;因為技術人員常常會專心在代碼或是某些技術上,但對於職業生涯思考方向算是被動,可能不是主動的或是被動推到經理的位置上,過去沒有經驗且可能對管理沒有深入的了解,初期在不熟悉的情況下可能感到慌張或焦慮;或是覺得 技術才是自己的根本,在面對上述問題,作者提到親自寫代碼是很好的實現方式,但作為管理者必須要掌握更多的技術,快速判斷該如何搭配使用,所以必須有更高效的學習方式,建議如下
建立你的學習機制 : 思考團隊內可以建立甚麼樣的學習機制,可以借助團隊的力量提升技術判斷力,也讓團隊能力提升。
請教專家 : 借助平台找到該領域專家大神進行請教,能成為某領域高手都有深厚的知識累積,且能用簡單精準的說明讓人容易明白與了解。
共創 : 對於知識型工作者來說,和大家共創所收穫的成功,比自己埋頭思考高效許多。
如果您對技術充滿著熱情,目標是成為一位優秀的架構師的話,做管理所累積的能力是完全可以遷移到架構師上,在管理上所具備的全局視野、規劃能力、結果導向、專案規畫及溝通與協調能力,這些都是優秀的架構師必須具備的條件之一。其次,不管是做技術管理或是架構師角色,看事情的角度都必須從 High Level 的角度來思考,建議如下
從目標出發看待技術 : 目標明確,才可以選擇最佳的技術方案,做出最合理的技術決策。
從評估角度看待技術 : 必須清楚了解技術方案是透過哪一些維度來評估好壞優劣,當技術問題暴露出來時會造成甚麼影響,損失的邊界為何 ? 
從依靠自己技術到借助大家的技術 : 要熟悉團隊每位成員的技術情況,知道誰可以勝任做什麼事,適合做什麼,借助大家的技術去做事
即便做不好也不是沒有回頭路,在轉作技術管理者時離技術很近,如果嘗試下來認為管理工作確實不是自己想要的(天命),那麼回頭繼續做工程師是幾乎沒有門檻的,但前提是自己必須先全力以赴的去嘗試一段時間,盡全力的去做一件事之後才不會有遺憾,才可以知道自己到底適不適合做技術管理的工作。

如何保持技術競爭力
如何保持技術競爭力是自己最感興趣的議題,在轉型技術管理者之後,自己可以支配與寫代碼的時間會越來越少(最近感觸很深阿),書中提到當你的角色從《技術實現者》轉變為《技術管理者》時,與技術的關係就發生了變化,過去開發者對技術的追求可能是以《技術實現者》的角度出發,但現在是轉變為技術管理者的角色,對於技術能力這詞也就悄悄的開始轉變,應該以技術應用者的角度出發,技術評估能力變得為其重要,要關心與思考的是 why & what,也就是要不要做這件事以及這是件什麼事情?並在綜合評估之後做出決策與判斷。
那麼如何精進技術判斷力就會是一個重要議題,作者提到技術評估有以下三個維度

維度一 : 技術項目結果評估
在決策要不要做一個事情時,需要回答三個問題
這究竟是件什麼事情
希望得到的結果是什麼
要用什麼角度/維度衡量結果,從那些技術指標去驗收結果
有個目標與希望預期得到的結果,才可以有始有終的做出準確的判斷與正確的決策,舉例來說
  • 可能為了要提升服務穩定性,去調整服務架構
  • 可能為了提升數據的準確性,去改寫技術數據的收集流程
  • 可能為了提升系統效能指標,去調整數據庫效能讀寫模組
像是希望提升系統性能,如何衡量結果是否有提升? 要用甚麼技術指標來進行衡量? 如果結果無法衡量的話,我們如何判斷這件事是做得好或是不好,因此,技術管理對於技術項目結果的評估能力最為重要。

維度二 : 技術可行性評估
可行性有兩層涵義,分別是 能不能做值不值得
  • 能不能做 : 是指有沒有能力做到,這是能力問題
  • 值不值得 : 是指能力允許,全力投入之後的結果是否是值得的(效益),這是選擇問題
在不懂技術管理的管理者一般提問的是 能不能做,有經驗的技術管理者與資深工程師則考慮的是值不值得,另外還需要考慮成本與收益部分。 那麼通常的技術項目,都有哪些成本需要考慮的呢
投入的資源成本
技術維護的成本
- 技術選型成本
- 技術升級成本
- 問題盤查成本
- 代碼維護成本
機會成本
協作成本

維度三 : 技術風險評估
技術風險評估也叫技術風險判斷,也就是有哪些技術風險需要未雨綢繆,該技術方案帶來最大的損失的可能性是什麼,以及在甚麼情況下會發生。舉例來說,為了降低 DB Loading 可能會加上像是 Redis 的 cache 機制,在使用時可能要思考當快取發生異常時,快取 Server 重啟因為沒有對應的快取資料,這時請求全部都跑去訪問資料庫,可能會造成快取雪崩或是快取穿透的狀況發生,這時候的解決方案或是甚麼 ? 要如何防範以及團隊同仁要如何解決,這些都可能是上線後可能會遇到的問題。風險評估考驗技術管理者的技術經驗與風險意識,經驗越豐富則對風險的判斷也就越敏銳。去拓展技術視野與技術判斷力常見方式如下
建立技術學習機制
專項技術調研項目化
與技術專家交流
聽取工作匯報
另外,你不是一個人在戰鬥,因此風險評估上也需要借助團隊的技術力量做出準確判斷,並非只靠技術管理者的技術判斷力,能從周圍人群學到多少訊息與資訊,而不是在靠自學。
核心是在如何提升技術實現的能力,轉變為提升技術判斷力與技術評估能力,有些管理者擔心自己一旦不是團隊技術能力最強的人,會因此有團隊成員不服氣,但從另外一個角度來看,管理者的職責是帶領團隊高效的交付高質量的產品與系統上,隨著年紀的增長,團隊中比你優秀的人才會越來越多,是一種好的現象,如果多年之後你依然是團隊裡技術最強的一員,可能不是一個好的現象。

...To Be Contined

心得
這篇文章僅介紹第一章節 : 管理路口的徬徨的部分,擔任開發人員也有10年的時間,其實在最近幾份工作主管都有建議可以嘗試往技術管理的路前進,但由於自己認為技術能力還尚未到一定的水準所以都不小心選擇逃避帶過,趁這個中秋連假期把該有的基本知識給惡補一下,光閱讀第一個章節就感觸蠻深的,提到過去自己很多深藏在心中已久的問題,其中也提到在不懂的知識下要找專業人員求助,這也讓我想到與前主管常提到的人脈的重要性,平常就需要累積人脈與研討會會認識一些技術愛好者,當你工作遇到問題時就會透過這種方式向大神們請教相關問題,當然態度方面是很重要的(別人也不是一定要回答你,回答問題也是需要時間成本),因此這點也是需要格外注意,雖然書還沒完全看完但已經有不少幫助,希望日後還有時間可以繼續下去。

參考
《知行》: 技術人的管理之路

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com