Skip to content

2022

Give and Take - Book Review

In this blog post, I will review the book "Give and Take" by Adam Grant. I believe that learning and growth are fundamental human needs. Sharing insights from this book serves as a form of active learning for me and hopefully for you as well.

Firstly, who is Adam Grant? He is a young professor at the Wharton Business School and is known for his insightful research and books. By his mid-thirties, he had already authored five best-selling books.

In "Give and Take," Grant challenges common assumptions, such as "winner takes all" and "nice guys finish last." These expressions reflect the perception that being too giving allows others to take advantage of you. This fear is often reinforced by TV shows and movies that suggest successful people must be ruthless. For example, the film "The Wolf of Wall Street" portrays finance as an industry where greed is good, and success requires one to be a monstrous alpha male.

According to the book, this perception is untrue. Grant outlines four pillars of success: strong motivation, capabilities, opportunities (or, in other words, luck), and the way you interact with others. He categorizes people into three types: takers, matchers, and givers.

Takers focus solely on what they can gain. Matchers give favors only when they expect something in return, adhering to a "quid pro quo" mindset commonly found in politics. Givers, on the other hand, prioritize others' interests over their own, helping people without expecting anything in return.

In real life, people often exhibit a mix of these styles, adapting to different situations. So which style is most successful, particularly for salespeople? Surprisingly, the book reveals that the top 10% of salespeople are givers. Why? One reason could be the principle of reciprocity: people are more inclined to assist those who help them.

Data also shows that givers are either top performers or bottom performers. The difference lies in setting boundaries. Givers who don't set boundaries find themselves depleted, with no time left for personal growth. Those who do set boundaries are more effective and find that helping others often contributes to their own development.

Instead of prioritizing wealth, power, pleasure, or competition, I favor and prioritize values like helpfulness, responsibility, social justice, and compassion. It may seem counterintuitive, but adopting a more altruistic attitude can result in mutual benefits in relationships. Research indicates that those who regularly give their time and knowledge to colleagues often receive higher raises and promotions.

In summary, the key principles for success are: 1) Show up, 2) Work hard, 3) Be kind, and 4) Be a giver. Striving to make people laugh, entertaining them, and contributing to a better world are crucial for building a good reputation, especially in a tight-knit work environment. It's not a zero-sum game; the goal is to help one another. If there's any way I can assist you further after you've read this blog post, feel free to reach out.

給予與接受 - 書籍評論

在這篇博客文章中,我將對亞當·格蘭特(Adam Grant)的書籍《給予與接受》進行評論。我認為學習和成長是人類的基本需求。分享這本書的見解對我來說是一種主動學習的方式,希望對你也有所幫助。

首先,誰是亞當·格蘭特?他是沃頓商學院的一位年輕教授,以其深刻的研究和書籍而聞名。在他三十五歲之前,他已經寫了五本暢銷書。

在《給予與接受》一書中,格蘭特挑戰了一些常見的假設,如"贏者全拿"和"好人最後才完成"。這些表述反映了人們害怕過於慷慨會讓別人占你便宜的觀念。這種恐懼常被電視劇和電影加以強化,這些媒體建議成功的人必須無情。例如,電影《華爾街之狼》將金融業描繪為貪婪是善舉,成功需要成為一個怪獸般的領導者。

然而,書中指出,這種觀點並不真實。格蘭特列出了成功的四個支柱:強烈的動力、能力、機會(或者說運氣),以及你與他人的互動方式。他將人們分為三種類型:接受者、匹配者和給予者。

接受者只關注他們能得到什麼。匹配者只在他們期望得到回報時才給予幫助,這種“交換條件”的心態在政治中很常見。而給予者則將他人的利益置於自己之上,不期待回報地幫助別人。

在現實生活中,人們常常展現出這些風格的混合,適應不同的情況。那麼哪種風格最成功,特別是對於銷售員來說?令人驚訝的是,書中揭示了前10%的銷售員都是給予者。為什麼呢?一個原因可能是互惠原則:人們更願意幫助那些幫助過他們的人。

數據也顯示,給予者要么是頂尖的表現者,要么是底層的表現者。區別在於是否設定了邊界。沒有設定邊界的給予者會發現自己被耗盡,沒有時間進行個人成長。設定邊界的人會更有效,並發現幫助他人往往有助於他們自己的發展。

我並不優先於財富、權力、快樂、競爭,而是偏好並優先於幫助、責任、社會公正和同情等價值觀。這可能似乎與直覺相反,但採取更利他的態度可以在關係中實現互利。研究表明,那些經常將時間和知識給予同事的人往往能得到更高的加薪和晉升。

總的來說,成功的關鍵原則是:1)出現,2)努力工作,3)善良,4)成為一個給予者。努力讓人們笑,娛樂他們,並致力於創造一個更好的世界對於在緊密的工作環境中建立良好的聲譽至關重要。這不是零和遊戲;目標是互相幫助。如果在你讀完這篇博客文章後,我還有任何可以進一步幫助你的方式,請隨時與我聯繫。

Brand Strategy Recommendations

In this proposal, I'm offering strategic recommendations for Thought Machine, a fintech product company. Thought Machine has developed a core banking product that is transforming the banking industry and enabling banks to offer innovative services to their customers.

Thought Machine has experienced impressive growth, recently raising $200 million in a Series C funding round led by industry-leading VCs and global banks, including Nyca Partners, Molten Ventures, JPMorgan, and Standard Chartered. This brings our total funding to $350 million, with a valuation exceeding £1 billion. We serve a diverse set of bank clients, ranging from Tier 1 to Challenger banks, such as Atom Bank, Curve, Lloyds Banking Group, Monese, SEB, Standard Chartered, TransferGo, Arvest, ING, and JPMorgan Chase.

Our product, Vault, operates as a ledger on cloud-native platforms (including Amazon Web Services, Google Cloud Platform, and Microsoft Azure) without relying on legacy technology. Vault's flexibility is powered by Smart Contracts, which can configure any type of retail bank product, including current accounts, savings, loans, credit cards, and mortgages.

We use the Clock Mode framework to evaluate every interaction between the brand and the consumer across three phases: pre-purchase, purchase, and post-purchase. The pre-purchase phase includes elements like social media, fintech events, partnerships, and responding to RFPs (Request for Proposals). The purchase phase involves enablement, API, self-service, and product service. The post-purchase phase includes support services, certification programs, training content, and newsletters.

We conducted a brand audit to identify immediate, visceral associations people have with our brand. Positive associations include terms like "modern," "smart," "technology," "trustworthy," "lean," "innovative," "scalable," "configurable," "performance," "security," "reliability," and "quality." Negative associations may include complexity, not being a "bank in a box," friction during integration, and a limited local market presence.

Building on the brand audit, we created an aspirational brand identity. The core essence of Thought Machine's brand is aspirational, simple, and visceral, serving as the foundation for modern banking. Our extended brand identity encompasses a range of features, from being a technology-focused, slightly geeky person to symbolizing cloud technology and a product-first approach.

Below are my strategic recommendations for Thought Machine:

  1. Differentiation: Focus on standing out from traditional vendors by building a high-quality cloud platform. Emphasize the unique capabilities of Smart Contracts, which offer unparalleled configurability. Strengthening this aspect of our identity can boost awareness and accelerate growth.

  2. Relevance: Offer cloud platforms that banks won't or can't build internally. Many banks are burdened with complex, siloed legacy systems. We should aim to deliver products reliably and efficiently to become an integral part of the banking industry.

  3. Sustainability: Maintain a competitive edge by offering to replace outdated mainframe servers with more modern, cloud-based solutions. Build long-term relationships with banks and integration partners to ensure success at scale and speed.

Feel free to reach out if you have any questions about this proposal: Victor Leung on LinkedIn.

品牌策略建議

在這個提議中,我對Thought Machine提供戰略建議,這是一家金融科技產品公司。Thought Machine開發了一款正在改變銀行業並使銀行能夠向客戶提供創新服務的核心銀行產品。

Thought Machine的增長令人印象深刻,最近在由業界領先的風險投資公司和全球銀行(包括Nyca Partners、Molten Ventures、摩根大通和渣打銀行)主導的C輪融資中籌得2億美元。這使我們的總融資額達到3.5億美元,估值超過10億英鎊。我們為一個多元化的銀行客戶群提供服務,範圍從Tier 1到挑戰者銀行,例如Atom Bank、Curve、Lloyds Banking Group、Monese、SEB、渣打銀行、TransferGo、Arvest、ING和摩根大通。

我們的產品,Vault,作為一個在雲原生平台(包括亞馬遜網路服務,谷歌雲平台和微軟Azure)上運行的分類帳,而無需依賴舊技術。Vault的靈活性由智能合約驅動,可以配置任何類型的零售銀行產品,包括當前的帳戶,儲蓄,貸款,信用卡和抵押貸款。

我們使用Clock Mode框架來評估品牌與消費者在三個階段之間的每一個交互:購買前,購買和購買後。購買前的階段包括像社交媒體,金融科技事件,合作夥伴和回應提案(Request for Proposals)的元素。購買階段涉及使能,API,自助服務和產品服務。購買後階段包括支援服務,認證程序,培訓內容和新聞通訊。

我們進行了品牌審計,以確定人們對我們品牌的直接,強烈的聯想。積極的聯想包括"現代","聰明","技術","可信","精簡","創新","可擴展","可配置的","高效能","安全","可靠"和"品質"。消極的聯想可能包括複雜性,不是"一站式銀行",整合期間的摩擦和有限的本地市場存在。

基於品牌審計,我們創建了一個期望的品牌形象。 Thought Machine品牌的核心精神是有遠見,簡單且強烈,是現代銀行的基礎。我們的擴展品牌形象涵蓋了一系列特點,從技術導向,有點書呆子的人到象徵雲技術和產品優先的策略。

以下是我對Thought Machine的戰略建議:

  1. 差異化:專注於從傳統供應商中脫穎而出,建立一個優質的雲平台。強調智能合約的獨特功能,提供無與倫比的可配置性。加強我們身份的這一方面可以提高認知度並加快增長。

  2. 相關性:提供銀行不會或不能內部建立的雲平台。許多銀行被複雜,孤立的舊系統所困擾。我們應努力提供產品,使其在銀行業中的地位不可或缺。

  3. 可持續性:通過提供更換過時的主機服務器為更現代的,基於雲的解決方案,以保持競爭優勢。與銀行和整合夥伴建立長期關係,以確保在規模和速度上的成功。

如果您對此提議有任何問題,請隨時與我聯繫:Victor Leung on LinkedIn

Setting Up Ubuntu Desktop on AWS Workspace

I've been a fan of the Ubuntu desktop distribution since 2009, back in my university days. It was exciting to use it as a Windows desktop replacement, although the journey was filled with challenges such as hardware compatibility issues related to the webcam, sound, and keyboard.

What I love about Ubuntu is the community support. I could always find answers to my questions on Google. However, when I first started, I would blindly copy and paste commands into the terminal and sometimes mess up the environment without knowing how to revert the changes. As a result, I had to reinstall Ubuntu Desktop multiple times.

Nowadays, I've migrated Ubuntu Desktop to an AWS EC2 instance. It works well with Google Chrome's remote desktop setup, and I enjoy the flexibility of choosing CPU, memory, and storage hardware based on my needs. Although the sound works, I've been disappointed by the browser scrolling experience, which feels delayed, especially when streaming YouTube videos.

This morning, I saw an announcement about the availability of Ubuntu Desktop on AWS Workspace and decided to try it out immediately. I had used AWS Workspace before—a fully managed Virtual Desktop Infrastructure (VDI)—and found the user experience to be better on Windows instances using the Remote Desktop Protocol (RDP). Since RDP is a proprietary protocol developed by Microsoft, I prefer not to use it. Meanwhile, Linux desktops use PCoIP, which can sometimes feel laggy and unresponsive. Additionally, the Amazon Linux2 image with MATE desktop wasn't customized to my liking.

Today, I finally have my preferred option: Ubuntu Desktop on AWS Workspace, set up using WorkSpaces Streaming Protocol (WSP). I'm writing this blog post from this very setup.

Step-by-Step Guide

Step 0: Before getting started, you'll need to set up a directory. You may be unsure whether to choose AWS Managed Microsoft AD or Simple AD. In my case, I only needed an inexpensive Active Directory compatible service, so I chose Simple AD, as shown in the screenshot below:

Step 1: Once the directory is set up, you can select it to create an AWS-managed workspace. This process takes some time, and you'll need to register it as well.

Steps 2 & 3: Next, create a user and identify them.

Step 4: Select the Ubuntu Desktop bundle. The UI lacks search and filter functionality, so you might have to navigate to the last page to find the Ubuntu options. You can choose from various hardware configurations. I picked the performance option because it currently has a free tier promotion.

Step 5: Choose between "Always On" or "AutoStop." I selected "AutoStop" with a one-hour timeout for cost savings.

Step 6: Skip the optional encryption for now.

Finally, wait for the status to change from "Pending" to "Ready." Then you can start connecting using the registration code. While you can download the AWS client and install it on your laptop, one feature I particularly like about Ubuntu Desktop on AWS Workspace is the ability to access it via the web. To enable this, follow one more step:

Go to the WorkSpaces console at https://console.aws.amazon.com/workspaces/ and, in the navigation pane, choose "Directories." Select your directory and then choose "Actions," followed by "Update Details." Expand "Access Control Options" and locate the "Other Platforms" section. Choose "Web Access" and then "Update and Exit."

Now you can access Ubuntu Desktop from any browser at https://clients.amazonworkspaces.com/webclient. Input your registration code to continue.

Enter your username and password. (If you've forgotten your directory password, you can reset it through your AWS console.)

And there you have it! You've successfully logged in to a fully functional Ubuntu Desktop in a web browser.

This setup is incredibly convenient, allowing me to access my workspace from anywhere. So far, the performance has been excellent, and I'm pleased with the user experience. If you have any questions about this setup, feel free to ask, and I'll be happy to share more information with the community.

在AWS工作區設置Ubuntu桌面

自2009年大學時期以來,我就一直是Ubuntu桌面版的粉絲。用它來替代Windows桌面非常令人興奮,儘管這條旅程充滿了挑戰,如與網攝、聲音和鍵盤相關的硬件兼容性問題。

我愛Ubuntu的原因是其社區支持。我總是可以在Google上找到對我問題的答案。然而,當我剛開始時,我會盲目地將命令複製並粘貼到終端,有時在不知道如何恢復變更的情況下破壞環境。結果,我不得不多次重新安裝Ubuntu桌面。

現在,我已經將Ubuntu桌面遷移到一個AWS EC2實例上。它與Google Chrome的遠程桌面設置配合得很好,而且我喜歡根據自己的需求選擇CPU、內存和存儲硬件的靈活性。雖然聲音可以正常工作,但我對瀏覽器滾動體驗感到失望,特別是在串流YouTube視頻時,這種體驗感覺上有延遲。

今天早上,我看到一則宣布Ubuntu桌面可在AWS Workspace上使用的消息,我立即決定試試看。我以前用過AWS Workspace——一種完全管理的虛擬桌面基礎設施(VDI),並發現使用遠端桌面協議(RDP)的Windows實例的用戶體驗更好。由於RDP是由微軟開發的專有協議,我寧願不使用它。與此同時,Linux桌面使用PCoIP,有時可能會感到延遲和反應不靈敏。此外,帶有MATE桌面的Amazon Linux2映像並不符合我的喜好。

今天,我終於有了我喜歡的選擇:在AWS Workspace上使用Ubuntu桌面,並使用WorkSpaces串流協議(WSP)進行設置。我就在這個設置下寫這篇部落格文章。

分步指南

步驟0:在開始之前,您需要設置一個目錄。您可能不確定選擇AWS管理的Microsoft AD還是簡易AD。在我情況下,我只需要一種價格低廉的Active Directory兼容服務,所以我選擇了簡易AD,如下圖所示:

步驟1:一旦設置好目錄,你就可以選擇它來創建一個AWS管理的工作區。這個過程需要一些時間,你也需要進行註冊。

步驟2 & 3:接下來,創建一個用戶並識別他們。

步驟4:選擇Ubuntu Desktop捆綁包。UI缺少搜索和過濾功能,所以你可能需要導航到最後一頁來找到Ubuntu選項。你可以從各種硬件配置中選擇。我選擇了性能選項,因為它目前有免費層次的推廣。

步驟5:選擇“一直開著”或“自動停止”。我選擇有一小時超時的"自動停止",以節省成本。

步驟6:現在跳過可選的加密。

最後,等待狀態從“等待”變為“就緒”。然後,您可以使用註冊碼開始連接。您可以下載AWS客戶端並在您的筆記本電腦上安裝它,但我特別喜歡AWS Workspace上的Ubuntu桌面的一個功能,那就是可以通過Web來訪問它。要啟用此功能,請遵循以下所述的一個步驟:

前往WorkSpaces控制台 https://console.aws.amazon.com/workspaces/,在導航窗格中選擇“Directories”。選擇你的目錄,然後選擇“Actions”,接著選擇“Update Details”。展開“Access Control Options”並定位到"Other Platforms"。選擇"Web Access"然後選擇"Update and Exit"。

現在您可以在https://clients.amazonworkspaces.com/webclient的任何瀏覽器上訪問Ubuntu桌面。輸入你的註冊碼以繼續。

輸入您的用戶名和密碼。 (如果您忘記了目錄密碼,您可以通過AWS控制台重置它。)

你辦到了!您已經成功地登入至一個完全功能的Ubuntu桌面網頁瀏覽器。

這種設置非常便利,允許我從任何地方訪問我的工作區。到目前為止,性能一直很出色,而且我對用戶體驗感到滿意。如果您對此設置有任何疑問,請隨時提問,我將很樂意與社區分享更多信息。

Setting up a Three-Tier Architecture on AWS

Today, I'm going to demonstrate how to use Virtual Private Cloud (VPC) services to set up a three-tier architecture on Amazon Web Services (AWS). Below is the architecture diagram that illustrates the setup, which is mainly divided into three layers.

The first layer is the presentation layer. Users can directly access the public subnet via the gateway. The second layer is the logic layer, which primarily deals with business logic. This layer resides in a private subnet to limit access and sits behind a load balancer. The load balancer enables flexible and horizontal scaling to handle varying traffic demands at different times. The third layer is the data layer, which houses a MySQL database in a private subnet. Access is only permitted through the second layer. To enhance availability, I've deployed the architecture across two Availability Zones, and the database is backed up to the other zone. This ensures that if one Availability Zone fails, the application services will remain operational.

First, I'll create a VPC network named victorleungtwdemo. As per the architecture diagram, I'll choose the 172.17.0.0/16 CIDR block. This /16 subnet will give me 65,535 IP addresses, which provides room for future expansion.

Next, I'll create six subnets. The first subnet is named pub-subnet-1. I'll associate it with the VPC I just created and choose the appropriate Availability Zone (Zone A). I'll also specify the IP address range for this subnet. To ensure scalability, I'll set it as a /24 subnet.

Continuing this process, I'll create the remaining five subnets. As shown in the diagram below, I now have six subnets in different Availability Zones.

Next, I'll create a new Internet Gateway, named victorleungtw-igw.

After it's created, I'll attach it to my victorleungtwdemo VPC.

Now, let's examine the routing table. A default routing table is automatically generated when the VPC is created. All the subnets I create will connect to this table by default.

I'll then create a new routing table named pub-route, which will manage data routed to the public network. Additionally, I'll rename the original routing table to priv-route. For the database subnet, I'll create another routing table named nat-route.

At this point, I have three routing tables. Each one comes with a default route.

For the pub-route table, I'll add a route 0.0.0.0/0 directed towards victorleungtw-igw. This allows all machines in the associated subnets to access the public internet.

Next, I'll associate my public subnets, pub-subnet-1 and pub-subnet-2, with the pub-route table.

Then, I'll add the nat-route and associate it with priv-subnet-1 and priv-subnet-2.

Finally, there's no need to worry about the remaining private routing table; all subnets will default to priv-route.

Now, let's move on to creating a Network Address Translation (NAT) gateway. I'll choose priv-subnet-2 as its subnet and create an Elastic IP (EIP) for it.

I'll add the NAT gateway to the NAT routing table and set the route to 0.0.0.0/0.

So far, I've completed about 70% of the network architecture. Next, I'll configure all the related security group settings.

For security, I'll create separate security groups for my bastion host, load balancer, web servers, and database.

Now, it's time to launch the relevant EC2 instances.

Before creating the RDS server, I'll also create an RDS subnet group.

Once the RDS server is set up with the appropriate VPC and security group, we can return to our EC2 instances.

Next, I'll set up a target group for the web servers and add them to it.

Lastly, I'll create an application load balancer.

With everything set up, we can now test the system. From the bastion host, I can SSH into both web servers, launch an Nginx server, and verify access to the database from the application layer.

That wraps up this guide to setting up a three-tier architecture on AWS. If you have any questions, feel free to connect.

在AWS上設置三層架構

今天,我將演示如何使用虛擬私人雲(VPC)服務在亞馬遜網路服務(AWS)上設置三層架構。以下是說明設置的架構圖,主要分為三層。

第一層是演示層,用戶可以通過網關直接訪問公共子網。第二層是邏輯層,主要處理商業邏輯。此層位於私人子網中,以限制訪問並坐落於負載平衡器後面。負載平衡器能夠靈活且水平擴展以處理不同時間的變化的流量需求。第三層是數據層,其中包含一個位於私人子網的MySQL數據庫。只允許通過第二層訪問。為了提高可用性,我在兩個可用性區域中部署了架構,並將數據庫備份到另一個區域。這確保了如果一個可用性區域失敗,應用服務將保持運行。

首先,我將創建一個名為victorleungtwdemo的VPC網絡。按照架構圖,我將選擇172.17.0.0/16的CIDR區塊。此/16子網將給我提供65,535個IP地址,為未來的擴展提供了空間。

接著,我將創建六個子網。第一個子網命名為pub-subnet-1。我將它與我剛剛創建的VPC關聯,並選擇適當的可用區域(Zone A)。我也將指定這個子網的IP地址範圍。為了確保可擴展性,我將將其設置為/24子網。

繼續此過程,我將創建其餘的五個子網。如下圖所示,我現在在不同的可用區域有六個子網。

接著,我將創建一個新的網路閘道,命名為victorleungtw-igw

創建完成後,我將把它連接到我的victorleungtwdemoVPC。

現在,讓我們看看路由表。創建VPC時,系統會自動生成一個默認路由表。我創建的所有子網默認都會連接到這個表。

然後,我將創建一個名為pub-route的新路由表,該表將管理數據路由到公共網絡。此外,我將將原始路由表重命名為priv-route。對於數據庫子網,我將創建另一個名為nat-route的路由表。

此時,我有三個路由表。每個表都有一個默認路由。

對於pub-route表,我將向victorleungtw-igw添加一個路由0.0.0.0/0。這允許所有在關聯子網中的機器訪問公共互聯網。

接著,我將把我的公共子網,pub-subnet-1pub-subnet-2,與pub-route表關聯。

然後,我將添加nat-route,並將其關聯到priv-subnet-1priv-subnet-2

最後,不需要擔心剩下的私有路由表;所有子網默認都會連接到priv-route

現在,讓我們繼續創建一個網路地址轉換(NAT)閘道。我將選擇priv-subnet-2作為其子網並為其創建一個彈性IP(EIP)。

我將NAT閘道加入NAT路由表並設置路由為0.0.0.0/0

至此,我已經完成了約70%的網絡架構。接下來,我將配置所有相關的安全組設置。

為了安全起見,我將為我的堡壘主機、負載平衡器、Web服務器和數據庫創建單獨的安全組。

現在,該啟動相關的EC2實例了。

在創建RDS服務器之前,我也將創建一個RDS子網組。

設置好RDS服務器後,帶有適當的VPC和安全組,我們可以返回到我們的EC2實例。

接著,我將為Web服務器設置一個目標組並將它們添加到其中。

最後,我將創建一個應用負載平衡器。

設置好一切以後,我們現在可以測試系統。從堡壘主機,我可以SSH到兩台Web伺服器,啟動一個Nginx服務器,並驗證從應用層訪問數據庫的訪問。

這就結束了在AWS上設置三層架構的指南。如果你有任何問題,請隨時聯繫我.

Stories of my career

I started my career working as an Assistant Marketing Manager in Brisbane, but then a year later I took a big risk and moved back to Hong Kong to start my own startup with my all savings for the year. I see an opportunity to build a website which allows users to find restaurants nearby.

I was able to do programming since I took classes on Pascal and Java back in university. However, I had limited knowledge of HTML, CSS and Javascript, so I had to pick up and learn in order to build the website for my startup. I learned a lot of technical skills, using Meteror.js and connecting with mongo databases. It was difficult since it was only me coding all day and night. I wrote a business proposal and submitted that to the government for funding. However, after a month of work, only 5 restaurant owners signed up for the website, with total revenue of a few hundred dollars. It failed because there was no way to attract more customers and we were running out of funds quickly.

If I would do it differently, I would learn about the lean startup process. I did not know what is MVP (Most Valuable Product) back in the beginning, and I built a lot of cool features, such as real-time maps and geolocation for finding restaurants nearby. It ends up nobody using it at all as it was not an important feature. Most of the website traffic was driven from Google search, so I should have focused on SEO instead of geolocation search at that time. I would do differently by using the agile scrum methodology and iterate on the product, getting feedback from the customers and prioritising the features based on the feedback.

I learn a lot of technical skills and business knowledge. The product was a full stack development by myself using Javascript, and I was able to find another job in software engineering after the failure of starting my own business.

Later on, since my startup failed, I found a full-time job, working at an Australian consulting firm Industrie IT as a software engineer, my first client was Riot Games, League of Legends, which is owned by Tencent. The project was a redesign of the game store that buy skins for champions. I was the sole front-end developer responsible for the implementation and I was committed in the sprint to writing a feature, with CSS animation on the purchase button.

I underestimated the complexity of this feature, and I promised to finish this within one week. However, there were some risks, because the design of the animation and the assets are provided by the designer. We were working in different time zones, where I was based in Hong Kong and the designer was based in Latin America. There was little overlap time between our working hours and their progress was delayed since the product owner could not decide which animation works better.

One day before the sprint end demo session, I finally received the animation file, and it was provided using photoshop, which I did not have a licence to open. The format of the animation was not compatible with the legacy browser, which is the safari 4 in-app browser. The latest CSS syntax was not supported and it does not render correctly as expected. There was no way I was able to demo the finished animation, given that I was stuck in some technical issues. What I did was raise the blocker in the standup meeting for a status update to the team, so that it becomes visible that it was blocked. Also, during the sprint demo session, I was able to demo one of the buttons that implemented the animation, despite I wasn’t able to complete all the buttons. It is still valuable to get feedback from the stakeholders to see how one of the buttons would look and improve. And in the sprint retrospective, I self criticised myself for the underestimation of the effort and promised to improve in the upcoming sprint.

As a result, the stakeholders are able to provide valuable feedback on the progress, at the same time, understand the effort has been provided and attempted to deliver on time. Since the project was not urgent to release, the stakeholders are okay with the delay and appreciate my transparency of the status, instead of trying to hide the fault.

This project, it was using an old safari 4 in-app browser embedded in the adobe platform. My task is to implement the new design and launch it to China users. I made the mistake did not perform testing on all platforms, but only on Mac and Windows 7. During the beta launch, customers who are using Windows XP started to complain and said they got a blue screen of death from a computer crash.

What I did is to investigate the root cause. It was not easy, because the Windows XP crash blue screen did not give a lot of useful information on why the system failed. And it seems to be a deep platform issue on the operating system level, which I was not an expert on. I tried to ask questions on stack overflow, and comments are mocking me for supporting Windows XP, which should be deprecated. However, the majority of the internet cafes were still using Windows XP, so I had to support it.

Finally, I have to try to collect as much data as possible, including trying to set up a new virtual machine with windows XP to replicate the issue. More importantly, I was using a binary search method like in computer science, by commenting out half of the code, and seeing if it crash or not, to see which half of the code may be causing the problem. Then further comment out half of the portion and finally find the root cause was a library called font-awesome, for rendering icons. The issue could then be rectified using png images instead of icons. And I learnt the lesson to test my application on different platforms.

For the second client, I was helping my client to implement mobile applications, both iOS and android platforms. It was an IoT project with an app to connect with luggage locks. In the beginning, we started to implement both iOS and android apps at the same time. However, after the end of the sprint, the customer realises some of the differences in user experience due to the difference between the two platforms, such as the back button. Also, the startup wants to get investor funding so they want to get the app to be ready for demo as soon as possible.

Therefore, I have to make a short-term sacrifice and focus on developing one platform first on iOS instead of Android. This is because the main customers would be Apple users, as the product enters the high-end, luxury demographic. By sacrificing the android platform in the short term, I was able to deliver the iOS app at a much faster speed with more features, better proof of the concept and polish on the user experience. Once the investment funding was raised, I was able to spend more time on the android platform with double the speed, since it avoids some of the re-work and it has a more stable set of requirements within a shorter period of time. The investment fund raised benefits for the long-term goals and let the start-up sustain itself.

This client was a small startup on Bluetooth lock. My task was to deliver the mobile applications to connect to it. One time the client expressed that he is not fully satisfied with the sprint end release that I delivered. The expectation is pixel perfect, with the colour matching exactly like the design, gradients and animation of the buttons need to be perfect. I was not able to meet the expectations as I did not notice the details in the few pixels alignment.

I pay extra attention to the pixels and colour, using different tools to measure the hex values and making sure correct alignment on different phone screen sizes. I reserved time and asked the designer for help to notice any issues she spots. I sat down with our designer and the client and explained the reasons for the few deviations in the design from what the client directly requested.

Although it took a lot of extra time and effort for those minor changes, it does improve and meet the client’s expectations. The client thanked me for going the extra mile to make sure he gets a perfect outcome. The start-up with the size of 2 people. They are working on an IoT project and building luggage with a lock connected with Bluetooth to the mobile app. I was a software engineer helping the customer to build the frontend application.

After the first version of the app was built and ready, the hardware side of the project was delayed. Therefore, the product owner started to think about redesigning the app without even launching it to the market. He was not a designer but started requesting a change of the design, and a couple of days later, he would change his mind requesting a change on a different design, which could lead to inconsistency. I was frustrated by frequent changes in the requirements and re-work.

What I did is to coach the client with agile methodology. The gist of it was to launch something to the market and get feedback from the customer so that we can deliver and prioritise the main features. It is a common pitfall for new entrepreneurs to want to launch the perfect product in the market with the best user experience. At the same time, it became the biggest psychological barrier for the product owner to launch something on the market. Instead, I introduced an A/B testing tool, so that I could build two versions of the app, and collect user feedback, to see which one is better.

Therefore, I was able to get data on the design of the mobile app. I was not frustrated because the change has data to prove it is something better, rather than based on the customer’s indecisiveness. The customer is happy as well because he knows which version is better and does not worry about different designs and re-work, focusing on the feature that is most important to the customer. Being apologetic and actively sympathetic is important when handling such situations, and providing a solution as soon as possible.

Later on, I decided to move to a bigger consulting firm and change my job working in Accenture, the client was Cathay Pacific Airways. The project is a migration of the legacy hybrid app to the native mobile, with better design and performance. It was a very tight timeline because the old app on the Kony platform has a license expiring in a few months. I have to finish re-writing all the logic in the new platform.

Near the end of the old platform license expiry, we still got a lot of features unable to finish. It is a hard deadline even though we are running on an agile scrum methodology. In order to meet the tight timeline with the fixed scope, and not sacrifice the quality, I have to compromise and work overtime, weekends and public holidays. I planned a trip to go to Cambodia with my girlfriend, but I have to cancel the flight and hotel. As a result, I make sure one of my biggest customers meets its year-end goal. The costs it saves from the licence and the 5 stars review on the mobile app store made from that project made it all worth it.

The higher management put a lot of pressure on internal reporting. It was many hours lost of productivity and administration, instead of focusing on the delivery of values and features to the customer. I escalated the issue and asked the higher management to follow the agile scrum approach. They are welcome to join the standup and sprint demo introspective of the progress. It would be an anti-pattern to use the waterfall approach and reporting.

Eventually, the customer is happy with the progress. And the higher management appreciates customer satisfaction, thus reducing internal progress report meetings that waste time and productivity.

There was one important feature needed to build a customer to online purchase flight tickets from the mobile app. It needs to integrate with one of the booking engines, called Amadeus. The task I need to do is implement the online flight ticket purchase without any bugs. However, I made a significant professional failure by using an open source library to calculate the decimal places. Most countries follow ISO 4217 standards for currency precision, which can range from zero decimals to three decimals. For example, USD amounts have two digits to the right of the decimal, and JPY has none. I did not realise the problem when using the library and it went through the QA process without any problems.

When the mobile app was launched to the public customer, Cathay Pacific Airways start to receive complaints that the online purchase via the mobile app got charged ten times more than the original amount! Luckily it did not happen to all countries, only to a few one. Turns out, not all countries strictly follow the ISO standard, such as Russia Ruble. It was supposed to be 2 decimal places while the system returns and counts with 3.

I immediately inform my manager about the issue and estimated the impact. The impact would be customers paying 10 times the money to buy a flight ticket. I need to communicate to stakeholders, with the customer service department about the technical issues, such that they would be able to handle customer queries. I also need to think of a plan, to roll back the bug and patch the error. I would need to notify the customer and create a force update plan for the mobile app, apologies for the inconvenient costs.

As a result, the company needs to refund the customer and apologies. What I learn from the situation is to pay extra attention to decimal places, and the situation comes up in my professional career a couple of times working in the fintech industry. More importantly, I should write more test cases and think of all the edge cases, such as different currency decimal places to make sure the system is working correctly. It is really customer money and the bug could lead to significant financial loss if the edge cases are not being considered carefully. I was able to minimize the problem and resolve it within 1 week of time. There was some customer affected in production and requested a refund and compensation. What I learn is to be extra careful with decimal places as it is significant. And I take responsibility to resolve the problem.

In the next phase of my career, I switched job and working at EY, my client was HSBC at that time. It was difficult because it involved many different vendors and stakeholders. Every day, in the standup meeting, instead of timeboxing it to 15 minutes, it took more than one hour and moved to a discussion section without any agenda. And then someday, when there is no particular progress, the customer starts yelling and blaming the team member for not delivering. The customer turns the environment toxic instead of being productive.

What I did is to set up a 1:1 session, and coach the client on why timeboxing a standup to 15 minutes is necessary. It is not a discussion session for random topics and there is a business impact, given the consultants are billing the banks with a couple of thousand dollars per hour. I manage the customer by asking him questions and helping him to find a better solution.

His reaction was the first defensive. This was because he was quite senior with many years of experience in the industry before the agile practice was common in the industry. Therefore, I have to coach him and help him to figure out why he got this behaviour. Turn out the client was stressed about the delivery timeline and worried that the team could not deliver on time. The more he worries, the more time he spends chasing progress in standup and the less productivity. As I help him to find out the root cause, I help him by suggesting a better approach, which is to schedule discussion sessions offline if necessary and only include relevant members to join. Also, I remind everyone to physically stand up in the standup meeting, so that they would feel tired from standing and shorten the unnecessary status update.

The outcome of this was positive. The team appreciates the time saved to focus on writing software. The client was actually less stressed because the team is actually able to deliver more. I was able to transform the toxic work environment into a healthier environment so that the project was able to deliver on time eventually. The project manager ended up being great friends with me in the end, and appreciate my feedback to help the team.

After the app was developed and launched, the users were not happy and leave negative reviews on the app store. I have to investigate why the users were not happy with the app. Because the mobile app has defects, different from the original design and product specifications. Why? People the developer were outsourced to other countries and there is a loss in miscommunication. Why? Because the developer was not an English speaker and did not fully understand the requirement. Why not one find it out early? Because there was no significant QA process. So I ensure the quality by adding test cases and making sure it aligns with the original user story acceptance criteria. As a result, less bug and 5 stars review on the app as everything work smoothly with an improved user experience.

While working in EY, I also joined a hackathon and pitch an idea for a project to check suspicious bitcoin transactions. Users are anonymous on blockchain and use it for illegal activities, such as money laundering and drug dealing. I did a POC proof of consent project in an attempt to get the wallet address that has a high risk of suspicious activities. As a result, it got further implemented into real-world applications. It was innovative because it does help with the regulation of the technology and facilitates the development of fintech.

Moving on, I switched jobs due to a friend referral and I was working at Dynatrce, my difficult interaction with a client was the Hong Kong Jockey club. I was a consultant and helped them install a new software monitoring system in their data center. There was only one week available to complete all the installation and it was difficult because the client has a tight time window and only can do changes during summertime when there is no horse racing.

It was my first time working in a physical data centre, where it required a security check and it was freezing cold to work inside. There are multiple stacks of machines and I have to remember which one I was doing the installation and plug-in with the KVM (keyboard, video, mouse) system. After a week of successful installation of 16 different machines in 2 data centres, and before the horse racing day resumed, the security team performed hardening of the machine. And suddenly at midnight, I received an urgent call and request for production support.

I took a taxi to rush to the data centre and saw my client crying there. Turns out the security team removed the root users to access the database, and due to some misconfiguration, it did not provide the right user access to access the database for the software monitoring software. What I did in this situation is to calm down my client and start doing the re-installation. This is because we were running out of time and we had to re-install all 16 machines before the race day started. Therefore, I had to work overnight and at weekends, squeezing all the workloads from 1 week to 3 days.

Due to the hard work, the software monitoring software is able to complete the installation before the horse racing day starts. My client who was crying appreciated my effort to go the extra mile working on weekends and at midnight to help complete the task by re-doing all the installations.

My other big customer was Huwai. The project is to integrate the software monitoring product into their cloud environment. There are many feature requests coming in at the same time before the SoW is signed. I was trying to help the customer as much as possible and take the lead to aggregate all the requirements. They want to customise the frontend UI, however, our product is English only and did not have internationalisation.

I help to raise a feature request to the engineering team in Europe. It was a difficult process as they did not understand the necessity to customise the front-end UI. A lot of pushback happened and they said no capacity and it was not in priority. I escalated the issue as Huawei is one of our biggest customers in the China region. I got the attention of the CTO and got his support on this feature request.

As a result, the feature got delivered, with a customisable UI. When Huwai cloud users launch a virtual machine, there is an option for them to select if it comes with software monitoring, and there is a customised UI in the Chinese language. I listened with understanding and took them through the process step by step with patience and care. I focused on making sure that the customer clearly understands and was able to use the product in the Chinese language.

In this Huawai project, I need to integrate the software monitoring application into their cloud platform. I was a consultant sent to the Shenzhen onsite office, while my manager was in Australia, who did not understand the customer. The client's request was to track the IP address of every user with personal identity information, which I have to say push back since this violates the GDPR (General Data Protection Regulation of the product.

I, personally, believe that there is always a solution to a problem. Regardless of how difficult it is, I will truly try my best to fulfil a request by a customer or at least meet them halfway. I would say no to a customer only if their request is simply not realistic, or expected me to directly break company policies. I asked the product engineering team to consider having a separate implementation, one for Europe customers who need to follow GDPR while one for China customers who have different regulations.

Consequently, the user frontend has to pass in a different header to identify as a China user. It would be difficult to analyse the IP by geolocation as the analysis may potentially violate the GDPR already. Meanwhile, it is also beneficial to the customer to think about the longer term and if they would consider a different implementation for global customers in different geolocation regions.

3 years ago, I leave my job and changed career to work at HSBC bank as a technical lead, the project I was working on was Malaysia FPX (Financial Process Exchange). It was a merchant online payment solution, where customers can go to Shoppee to pay and select debiting from their HSBC account using FPX. The situation was an existing platform using a legacy system, and I need to drive from improvement to increase the success rate.

The existing platform has a transaction successful rate of 30%. It was a very low rate, given that the regulatory requirement is a 70% success rate. My task is to increase the success rate by rebuilding the platform using a newer technology stack, such as Angular JS for the frontend and Java spring boot for backend applications.

After a few months of hard work in the project, the new platform was finally launched, I had a hope that the transaction success rate would significantly improve and reach the 70% target. However, it turned out the new successful rate was only 60%. I do not know why, so I have to conduct an investigation by using customer feedback. Firstly, I tried to use the tool called Splunk to collect all the transaction logs and count all the errors to identify what are the common error reasons, such as timeout. Also, I tried to reach out to the customer service team to find any user feedback. Turns out I found out we had an accessibility issue on the website. If you are a customer who is visually impaired, you would not be able to read the screen and know the transaction needs to be completed within 10 minutes. They take time and struggle to navigate the page, and it would time out and fail to complete the transaction.

Because of the feedback collected, I fixed the errors due to system issues and frontend accessibility issues. This increased the transaction success rate to 70%. This is important because it is a regulatory requirement from the Malaysian government, and it avoids a business impact on the bank by paying a large amount of penalty. The project also reminds me of customers who have accessibility issues, such as those who are visually impaired, any fix the details that would have every single customer. I have to approach every project with a clear and open mind to take the customer feedback.

During my time there, I was also proud to join an Open banking hackathon. I encourage HSBC to take the risk and adopt banking login as a service for other platforms. It could be security risky for the bank, but it meets the business goals since the bank account has already done all the KYC. I got to the senior CTO level and pitch the idea and show the demo. The CTO was impressed and my team win one of the awards for the hackathon.

When I was living in Hong Kong, I took a calculated risk and moved to Singapore. This is because Singapore has a lot more opportunities in financial technology in the Asia Pacific and it would fulfil my professional goal with overseas work experience. The trade-off requires me to move out of my comfort zone as I had a stable job in the bank HSBC, working as a technical lead in the corporate world. I have to leave my family and friends in Hong Kong to get to an unknown startup environment. It was a calculated risk because, in the worst-case scenario, I could still move back to Hong Kong if I did not enjoy the work environment in Singapore. However, the upside is unlimited, as I could see different opportunities and work environments, even in this challenging covid19 situation and required for 14 days of quarantine in the hotel. The outcome is I really enjoy the work environment in Singapore, it’s green, well planned and organised. There are also many work opportunities in the fintech industry.

Currently, I work at Thought Machine as a client engineering manager. It is a post-sales role, which means I am billable by the hours and service provided to the customer. Once the project is finished, and no longer billable, it is handed over to the customer and they are on their own.

However, in most of the scenarios, the client would have a need to ask some questions or production support queries. They would be able to contact me via the slack channel since I had built a personal relationship with the customer. At the same time, the needs of my business are to focus on billable hours and filling in timesheets for utilisation. The time it takes to answer customer queries would be out of scope and not billable.

To balance it, I would still try my best to find out the answer for the customer, even if it may mean I need to work some extra hours to compensate for it. It may not be billable right away, but the need of answering the customer's questions should be a high priority.

Overall, client is happy to get technical queries resolved within a short period of time. Instead of going through all the processes to raise support tickets, wait for a few days to get feedback. And after I have answered more than 10 technical queries, the customer was happy to compensate me by paying me for billable hours and satisfied the needs of both businesses. My approach is always thinking about long-term benefits for the business and retention of the customer rather than making a short-term profit and losing the customer. Sometimes, customers ask questions about a product issue. The balance was not deducted correctly. I felt they need an answer right now, but I think they need the correct answer instead of a quick answer.

I get on a call and set the expectation that I was trying to collect more information instead of resolving the issue right now, as I may need help from the UK team at different time zones. Communication is key here and I set the expectation that I will get back to them as soon as possible. And I have to work overtime staying late till the UK hours to help troubleshoot if required. Therefore, while the customer gathered more log information in the call, they realised something was wrong with the upstream system and sent the wrong balance amount in the request. The root cause was identified and resolved while trying to troubleshoot the issue.

One of my clients now is a Singapore Digital bank. After I delivered the python code for them to implement the current account business logic, it was tested and it was going to launch to production in beta. And before the launch, the monetary authority of Singapore would be required to perform load testing by a third-party auditor, which is EY. They were doing performance testing on AWS on our platform and when it hits 15 transactions per second (TPS) to one single account, they started to see response time degrade and get longer latency on response time. The customer raised a production incident ticket and I had to reply within the Service Level Agreement (SLA), as I was in the first line of support helping out the customer.

What I did is to request the relevant information quickly, including the Grafana dashboard for metrics data, kibana for logging data, as well as the latest source code from production. I was able to analyse the data and identify the main issue is a feature on user transaction daily limit. It was a feature where customers could only spend a fixed maximum amount per day, such as $1000 SGD. The key issue is the implementation was trying to loop through one day of transactions, and aggregate the total amount in order to check the current spending. It becomes an issue with 15 transactions per second, which becomes 900 per minute and 54000 per hour! I respond immediately to the situation by providing the root cause analysis and mitigation, where I changed the implementation by using a variable to store a record of the running total.

Therefore, the code was much more performant than the original implementation. I was able to resolve the production incident within a short period of time, and it helps the client perform the third-party audit check and complete the time-sensitive regulatory requirement within a short window.

Besides, the sales team will always ask me for an estimation on a prospect, and see how long would it takes, how many resources and how much it would cost for the prospect if they choose our project team to deliver the result. It usually required a quick judgement, since the prospect would only give a few days to respond and the requirement provided is incompleted and only a few lines, such as multiple currency support of the account with compliance, without any details.

I would need to make a quick judgement of the project estimation. Because if the estimation cost is too high, the prospect would not choose my company to deliver the project. However, if the estimation is too low, I would be in trouble as not having enough resources and time to deliver within the tight timeline. And usually, the prospect did not know what they want as well, and the procurement team is not the one who comes up with the product requirement.

What I did is try to approach the prospect, set up a call and clarify as much as possible. Then I would make some assumptions and validate them again with customer feedback, such as assuming the client environment has the infrastructure ready, the pipeline setup etc. And then I would also reach out to my other project team with similar project scope to collect data points on their delivery. Besides, I would make the best cases scenario and worst-case scenario estimation with some buffer to compensate for the lack of deep analysis of the requirement.

Eventually, the sales team was able to get back to the Vietnam prospect, and they were happy with my proposal. They selected my company product out of 4 other vendors for their core banking system. More importantly, the project was able to deliver on time because it was a realistic timeline and reasonable assumptions were made.

After I started working in my current job, I needed to learn about Kubernetes and Cloud technology since it is used in the product. I want to get certified and validated by knowledge, so I took multiple exams, such as CKA, CKAD and CKS for Kubernetes. Google Cloud professional architect certifications, Azure and also AWS cloud certificates. It took a lot of time to take online courses, watch videos, and reading blog posts, reading books about all the best practices. And more importantly, I do hands-on practice and try to solve real-world problems, applying knowledge in practical solutions. Recently, I got the certificates, not only learned the concepts but forgot about them after exams. Instead, I learn by doing and still use them to solve real-world problems.

My job now is client facing and need to do a product demo. After doing the product demo at a couple of sprint end, I set a goal for myself to improve my presentation skills and be a better storyteller. I recognised that communication was the heart of the job, so I really wanted to become a master communicator and impress my client. I spent a lot of time practising and joining the toastmaster club, paying attention to feedback on what did well and what did not do well, such that I can improve on it. I even enrolled on a storytelling class to help me advance. My efforts eventually led me to present a sales pitch in front of a Taiwan prospect, where I was able to show our product demo and answer technical queries. As a result, they selected my company's product for their new project.

It has been a long journey since I started my career 10 years ago. I am writing all these stories as a practice to improve my communication skills, which is essential in order to reach the next stage of my career. Hope you enjoy the stories.

關於我的職業生涯的故事

我開始我的職業生涯時在布里斯班擔任助理市場經理,但一年後我冒了很大的風險,回到香港,用我一年的積蓄創辦自己的初創公司。我看到一個機會,就是建立一個讓用戶能夠找到附近餐廳的網站。

我在大學時候學習Pascal和Java,因此能夠進行編程。然而,我對HTML、CSS和Javascript的知識有限,所以我必須學習這些技能,以便為我的初創公司建立網站。我學到了許多技術技能,比如使用Meteror.js並連接到mongo數據庫。這很困難,因為我每天都在寫程式碼,而且我自己一個人寫。我寫了一份商業提案,提交給政府申請資金。然而,經過一個月的工作,只有5個餐館老板登記到我們的網站,總收入僅幾百元。我們失敗了,因為我們無法吸引更多的客戶,而且我們的資金也很快就用完了。

如果我可以重新來過,我會學習關於精益創業的程序。我一開始並不知道什麼是MVP(最重要的產品)。我建立了許多很酷的功能,如即時地圖和附近餐館的地理定位。然而最終沒有人使用這些功能,因為它們並不是重要的特性。大部分的網站流量都是來自Google搜索,所以我應該在當時更專注於SEO而不是地理位置搜索。我會用敏捷的Scrum方法進行迭代,並獲得客戶的反饋,根據反饋來優先執行功能。

我學到了許多技術技能和商業知識。我能夠獨力使用JavaScript進行全棧開發,並且在我自己的業務失敗後,我能夠找到另一份軟體工程師的工作。

後來,因為我的初創公司失敗,我找到了一份全職工作,成為了澳洲企業諮詢公司Industrie IT的軟體工程師。我的第一個客戶是Riot Games,擁有《英雄聯盟》的遊戲公司,該公司由騰訊擁有。這個項目是重新設計遊戲商店,用來購買角色皮膚。我是唯一負責實作的前端開發者。我一直致力於寫一個功能,並在購買按鈕上添加CSS動畫。

我低估了這個功能的複雜性,我承諾在一週內完成這個功能。然而,這裡有一些風險,因為動畫設計和資產都是由設計師提供的。我們工作的時區不同,我在香港,設計師在拉丁美洲。我們的工作時間幾乎沒有重疊,設計師的進度也因為產品所有者無法決定哪種動畫更好而被推遲了。

在展示會結束的前一天,我終於收到了動畫檔案,但這個文件是用photoshop提供的,我沒有許可證可以開啟。這種動畫的格式與舊的瀏覽器不兼容,比如Safari 4的內置瀏覽器。它不支援最新的CSS語法,並且它不能正確地顯示