Monday, April 5, 2021

建立框架 : 我的評鑑報告心得



故事從兩周前收到晉升候選人的通知說起;雖然有一些晉升和對高階主管報告的經驗,不過這次卻面臨到全新的挑戰。

1.  必須在不到兩週的時間內完成兩次評鑑報告(備註1)。

2.  相較於其他被評鑑的同仁,因為目前擔任產品研發,所以參與外部專案(公司主要收入來源)的貢獻是相對薄弱的。

 

這兩次報告,我決定把重點放在技術的亮點和過去如何帶領團隊完成不可能的任務的故事為主。

 

 

在 《Pitch Anything為什麼Google、LinkedIn、波音、高通、迪士尼都找他合作?》書中提到:

 

「所有訊息會先經過鱷魚腦初步過濾,不危險,不新鮮或不刺激的資訊,在大腦這一層就會被拋棄。」




(
圖片來源:博客來)


而在報告過程中,我們的框架(氣場、視角)支配權乃致勝關鍵:

1. 不論有無意識到,每個人都在使用各自的框架。

2. 每個社交場合都會讓不同的框架聚在一起。

3. 框架之間無法長時間共存,而會相互碰撞,直到某個框架勝出。

4. 勝出的框架會主導人際互動,能支配其他框架。 


 

對於以技術為主的評鑑委員,我的框架鎖定以「產品微服務化」和「領域驅動設計(Domain Driven Design)」兩項主軸,來帶出團隊如何能在開發新產品的同時,兼顧到彈性及擴展性。 這兩個主軸是公司開發人員近年很想也很難掌握的兩項技術,鐵定能讓技術底子的評鑑委員專注幾分鐘。

(事實證明,技術工作者對於怎麼做微服務化或使用DDD比較有興趣,至於產品有沒有賣出去就不那麼在意了。)

 

而針對以專案和客戶為導向的管理層,我以「一個沒有SAP經驗的專案經理,實現跨集團SAP升級及導入新模組專案」的故事,透過建立吊胃口框架和大獎框架(《Pitch Anything》)來引起對方的興趣並暗示:

 

「我曾從 0 到完成一個跨集團的專案,我已經準備好去完成更大的任務了,我想知道,你們也是否也準備好了?」

 

但在報告中引用其他公司的經驗是個險招,畢竟我說的這個故事和要升遷我的公司毫無關係。 所以我必須再疊加其他框架來吸引這些身經百戰的主管。


在《What's Your Problem 你問對問題了嗎?:重組問題框架、精準決策的創新解決工具》,提到了重組框架:

 

「改變看待問題的方式(重組問題框架),可以幫助你找出更好的解決方案。」

(圖片來源:博客來)

 

 

這個框架很適合拿來說明我如何能藉由過往經驗解決現在或未來專案的問題。

… 在所有的專案中,不管是專案延期、成本增加或是無法驗收等(老闆和團隊的)痛點中,要解決的核心問題其實不是專案鐵三角(成本,範疇或時間)。

 

 

而是"人",人才是提出和解決問題的關鍵。 所以我提出了以下的問題解決能力來加強我的框架:

 

「本人歷年來作為業務單位和技術團隊的橋樑,擅長與人溝通及合作來完成任務,無關乎專案的大小或種類。」

 

至於評鑑結果,並不是重點。 在過程中思考了自己的價值和發展方向,練習了幾種框架的表達方式,才是我最大的收穫。

 

 

參考書籍:

 

ü  我,就是品牌

ü  為什麼Google、LinkedIn、波音、高通、迪士尼都找他合作?:募資提案教父1週談成6千萬的快‧精‧準攻心術

ü  你問對問題了嗎?:重組問題框架、精準決策的創新解決工具

 

 

 

 

備註1.

第一關(技術評鑑),評審委員有部門主管、PM和技術顧問。

第二關(領導和溝通評鑑),報告對象是公司的BU heads。

 

 

 


Monday, March 1, 2021

[PostgreSQL] Recursive CTE for hierarchy data

 

 PostgreSQL   CTE   Hierarchy

 

 

▌Problem


 

Assume that we have a table, Departments, which include hierarchy data like this,


 


 

and we would like to know the Agile dev team’s parent hierarchy, for example,

Agile dev team / Tiger department / IT

Here is a sample for using CTE(Common table expression) and RECURSIVE modifier to solve the problem.

 

 

▌Solution


 

▋Recursive CTE


WITH RECURSIVE cte_recursive AS (
        SELECT *
        FROM "Departments"
        WHERE "Id" = '001'
        UNION ALL
        SELECT t.*
        FROM "Departments" t
        INNER JOIN cte_recursive r ON t."Id" = r."Parent"
)
SELECT * FROM cte_recursive;


 



 

 

The recursive CTE results in:

 



 

 

 

▋Function (Optional)

 

We can create a function for advanced usage.


CREATE OR REPLACE FUNCTION public.find_hirearchy_departmemts(id text) RETURNS SETOF "Departments" AS 
$function$
BEGIN
    RETURN QUERY
    WITH RECURSIVE cte_recursive AS (
        SELECT *
        FROM "Departments"
        WHERE "Id" = id
        UNION ALL
        SELECT t.*
        FROM "Departments" t
        INNER JOIN cte_recursive r ON t."Id" = r."Parent"    
)
    SELECT * FROM cte_recursive;
END;
$function$ LANGUAGE plpgsql;

 

 

 

▌Reference


▋WITH Queries (Common Table Expressions)

▋PostgreSQL CTE




Friday, January 29, 2021

[Golang] Install and Get started with samples

  Golang   Get Stared    Install Golang   




 

▌Introduction


 

Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.

See more details on golang.org.

 

Learn how to install Go, create a Hello world and some samples in the following links.


▋Install Go

 

1.  Install on Windows

2.  Install on Ubuntu

 

 

▋Hello World

 

This is the tutorial from official golang.org. 

I shorted it up in this article.



▋A TODO website

 

In this tutorial, we will use http package to create a TODO list website that can

  • List done and undone TODOs
  • Create new TODO
  • Remove a TODO

[.Net 5] Upgrade to NET 5 issues

 

 .NET 5   Upgrade issues   

 

 

▌Trouble shooting


 

 

▋The "RazorGenerate" task failed unexpectedly

 

After installing .NET 5 SDK, using Visual Studio 2019 (Version 16.8.3) on Windows to build .NET Core 2.2 project will get the error:

 

The "RazorGenerate" task failed unexpectedly

 

 

To resolve the issue, following the steps (Reference: https://stackoverflow.com/a/64834683/7045253 ).

 

1.  Set DOTNET_HOST_PATH environment variable.

$ setx DOTNET_HOST_PATH "%ProgramFiles%\dotnet\dotnet.exe"



2.  Delete C:\Program Files\dotnet\sdk\NuGetFallbackFolder.

3.  Restart your PC.