公司各個階段 CTO 需要做什麼?

powerzhuye發表於2018-09-22

CTO 是企業內技術最高負責人,對企業的發展起到至關重要的作用。但隨著公司的不斷髮展,CTO 的工作重心也會不斷變化。只有在正確的階段做正確的事,才能更好地為公司做出貢獻。我是空中金融 CTO ,TGO 鯤鵬會上海分會會員。加入空中金融之前,我曾在餓了麼、空中網、5173 等網際網路公司擔任中層技術管理者,有過三次從 0( 或 0.5 )開始的創業公司工作經歷。本篇文章,我將為大家分享,公司初創階段 CTO 需要做的事。

假設一個公司發展有以下幾個階段:

  • 0 :創始階段;
  • 0.5 :有產品但無管理階段;
  • 1 :經過 1年的發展初步穩定的階段;
  • 1+ :穩步發展階段。

這一篇,我將和大家聊聊公司初創階段 CTO 需要做什麼。剩下的階段將會在另外一篇文章分享。

初創公司 CTO 或者技術負責人,最重要的目標是在最短時間內用有限的預算打造合適的團隊把專案做起來。說說我遇到的兩種初創公司的情況。

從 0 開始的情況

從 0 開始指的是:你是公司第一個技術人員,你需要從 0 開始搭團隊。最初,你需要做如下幾項工作:

預算和組織

評估專案第一版在規定時間內上線需要多少人的技術團隊,是否需要分產品線,規劃出不同崗位的人數。比如,專案經理 1 人、前端 2 人、後端 5 人、客戶端 2 人、UI 設計 2 人、產品經理 2 人、測試 3 人、運維 2 人等等。然後根據技術團隊的規模預估人員成本,以及做伺服器、軟硬體的預算,把這些預算和整個公司的預算放到一起評估,看是否可行。如果可行,立即全面開啟人員招聘。如果初期人數不超過 20 人,不需要特別複雜的組織架構,所有人直接向你一人彙報也可以。在專案執行過程中,專案經理甚至是產品經理可以幫你負責一部分管理工作。在初期,雖然徹底扁平化的架構會很累,但有助於提高效率和執行力。

人員和招聘

對於一般做產品的初創公司而言,業務量不大,不需要高階人才,需要的是踏實肯幹、願意拼搏、願意與公司一起成長的具有相同價值觀的人才。公司初創階段各崗位需要大量招人,選擇合適的面試方式和麵試難度非常重要。我會通過筆試初篩,以節省時間,避免和不合適的面試者禮節性聊天。

我的筆試有兩個特點:

1、可以開卷

我不反對現場拿手機查資料,但是因為筆試時間固定,現場查資料往往意義不大。第一,我的筆試題不是網上搜的,沒有現成的答案;第二,大部分內容考察的都是技術細節或對技術的整體理解。如果面試者之前不理解或是沒有經驗,臨時抱佛腳用處不大。

2、筆試考察的知識面是比較全面的

比如,後端的面試題涉及到語言基礎、演算法、SQL 、虛擬機器、Linux 、架構設計、設計模式、框架等分類,難度比較高。30% 的面試者在看到筆試題後會選擇放棄,其實只要是認真回答問題的,哪怕只答出 40% ,我也會安排面聊。我只是希望通過難度較高的面試題刷去一些心裡不那麼強大的面試者。

在招聘淡季,我會要求人事廣撒網進行筆試,因為確實遇到過一些工作經歷不那麼出色,但技術基礎特別紮實的面試者,如果簡歷初篩淘汰了這樣的面試者是比較可惜的。筆試之後的面聊會針對筆試的問題展開討論,並且要求面試者介紹之前的專案經驗、學習方式以及對技術的追求。

面試是搭團隊最重要的一個環節,搭團隊是技術管理者最重要的事情之一,怎麼強調面試的重要性都不過分。最好在最初能招到幾個優秀的人作為核心成員,這樣可以讓他們來分擔一些面試工作,讓自己有時間做其他的事情。初創團隊的人員必須個個是精英,比如,一個只有 3 個人的前端團隊,其中 1 個人很平庸,那麼你的前端團隊就有 33% 的人是很平庸的。如果因此前端成了短板,那麼 1 人的問題就極大限制了整個技術團隊的效率和產品質量。

專案和產品

在招聘的同時應該抽時間來制定專案計劃,如果技術管理者不熟悉業務,需要先做功課熟悉產品的業務形態,這樣才可以評估產品的技術難度和工作量,以便做出合適的計劃。有了明確的研發計劃,公司的運營、業務部門才能根據這個計劃做相應的推廣運營計劃。

除了計劃,需要先用腦圖把核心業務的領域、模組、功能梳理出來,和管理層一起把產品形態討論清楚,然後在產品研發內部宣講,讓大家對產品的目標達成共識。在初期,產品可以根據這個方向來細化形成產品文件,技術可以根據這個方向來調研需要的技術。

技術和架構

技術架構方面有幾點非常重要:

語言

開發語言是招聘之前就應該確定的。一般而言,技術管理者會選擇自己熟悉的語言作為專案最初的核心語言。對於業務型專案,採用 Java 或 Python 這種普適性語言;對於純高併發的服務端專案考慮 Go ;對於 Windows 專案或企業級專案考慮 .Net ,按照這個方向來做不會出大錯。我不太建議在初期融入太多語言,或許不同語言的結合可以發揮出效能和開發效率的優勢。但在初期就混用會增加管理成本,提高基礎框架的開發難度,而且每一種語言的開發都需要學習和成長路線,得不償失。

框架

確定了語言之後,圍繞語言我們要確定開發框架。一般而言就是前端的 JS 、CSS 框架、後端的 MVC 、SOA 、ORM 框架的選型。如果沒有一定積累,不建議選擇自研,可以先選用成熟穩定的開源技術作為開始。專案發展到一定階段,如果開源技術不能滿足需要,在選擇自研合適的框架或中介軟體來進行逐一替換。

架構

包含幾個方面的不同型別的架構,這些事情雖然不可能在很短的時間內都想清楚,但這是領導者必須考慮的。很多公司很多專案在執行了幾年之後,核心系統總體上還是維持了第一版的架構,雖然遇到各種問題想要推翻重來,但都因為代價實在太大而擱置或放棄:

  • 產品架構:戰略是怎麼樣的,是否需要進行產品化抽象,擴充套件性是怎麼樣的;
  • 系統架構:網路怎麼接入,哪些環節做高可用,涉及到哪些中介軟體,儲存是什麼,容量評估;
  • 業務架構:多少領域,多少子系統,對內還是對外,怎麼相互支援;
  • 應用架構:層怎麼分,邏輯層還是物理層,模組或服務怎麼分,模組和模組之間怎麼通訊,同步還是非同步;
  • 工程化:我們是需要考慮可持續、可迭代的,一個良好的工程結構和工程方式也是初期需要確定的。比如,確定專案結構、原始碼管理方式、分支管理方式等等。

核心業務

在幾個創業公司工作時,我都會自己來實現最底層的技術框架或核心業務程式碼。一方面自己可以完全把控最難的核心繫統,另一方面可以順便把技術架構搭建起來。接下去,團隊成員就可以在這個骨架上填肉,這樣即便一開始沒有很好的標準和指導原則,也可以把控住整個專案的程式碼。

技術難點

除了核心業務,我會在最初就分析專案的技術難點,這些技術難點我們會選擇三方技術來實現。但是一開始我們就要去考慮以後要脫離三方技術自己實現核心技術的可能性和代價,把這些問題擺在桌面上,讓所有管理層都認識到。

除了這些,技術管理者需要做到的非常重要的一點就是以身作則,給大家做榜樣。團隊的規則和規矩一視同仁,這樣,團隊成員在執行你定的這規則的時候才沒有任何理由拒絕和做不到。

從 0 開始確實需要做大量的工作,研究討論產品方向,做產品計劃,大量面試和新人培訓,自己參與部分程式碼編寫,還要凝聚初始的團隊和團隊磨合。這些事情往往會讓你覺得分身乏術,但這段時間熬過去後,你就會體會到,這些工作都非常有意義。相反,如果一開始缺失這些工作,讓技術野蠻生長,之後的工作就會很混亂。

從 0.5 開始的情況

從 0.5 開始的情況是,公司已經有一支團隊,產品也已經上線。由於前期缺乏管理,技術方面處於一個爛攤子的狀態。開發效率低、問題多,無法滿足公司高速發展的需要。這個時候進入公司和從 0 開始的情況略有不同(但這其實又不同於成熟公司空降管理層),對內,我會在最短的時間做下面的工作:

熟悉產品

熟悉這個行業或領域,熟悉公司既有的產品,評估產品的技術難度,心裡對期望的團隊形態有一個底。同時可以花一點時間過一遍現有專案的技術架構和程式碼,對於現有的技術債也有一個預期。

熟悉團隊

對現有團隊成員進行 1 對 1 溝通(或者直接點說就是面試),瞭解每一個人的技術水平,當前的心態和狀態以及對公司的期望。

開展救火

根據對產品的理解和已經與各需求方溝通的結果,按照輕重緩急整理出目前技術上需要調整的部分,挑選最重要的任務進行突擊救火。可以進行小黑屋形式的集中開發,給予團隊一定的壓力,把工作分配到具體的人。一方面考察每個人的能力,一方面也考察成員的抗壓能力和拼搏精神,追求安逸的人不適合在創業公司工作。如果業務在高速發展,不太建議一開始就停滯業務的迭代,把老專案推翻重來。最好的方式,是先進行必要的重構,等以後每一塊業務進行大調整的時候進行逐一推翻。

調整團隊

根據 1 - 3 的結果,快速進行團隊調整,勸退不合適的人,招聘需要的人才。這些調整是基於一段時間對於產品和團隊熟悉後的結論來的。並不建議所謂的新官上任三把火,在不瞭解團隊的情況下直接調整。有的時候可能會心軟,認為不合適的人可以去幹一些沒有那麼大技術含量的工作,我也這麼做過,但最後都付出了代價。

徹底融入

我個人的習慣是挑選比較重要的某個痛點自己上陣,對程式碼或架構開刀,只有這樣才能真正瞭解大家目前遇到的問題,並且能儘快熟悉業務,大家融入到一起。如果時間有限,就把工作放到晚上或者週末進行。只有自己走到了最前線,才能在做出更有利於團隊實際情況的決策。

建立信任

作為管理者進入新團隊,團隊的成員會擔心新上級做出的團隊調整會對自己有影響,會造成軍心不穩。所以,在進行團隊調整時,一定要對核心成員進行肯定和鼓勵,另外,信任的建立不能僅靠權勢,更重要的是,在日常工作中和大家一起拼搏,給予大家幫助,和大家建立平等的信任關係。

對部門外,需要同時和其他部門的負責人進行逐一溝通,瞭解大家對產品和技術的期望。另外,需要和 CEO 進行密切溝通,使自己的決策得到上級的支援。一般而言,我還會接手對公司外部的溝通工作,讓團隊成員可以更專注於專案。

0.5到1的階段

公司經過了初創階段,產品也已經上線執行。接下來產品需要高速、高質量迭代,作為技術管理者需要把各方面都規範起來。

管理需要標準化

建立專案管理流程:

  • 是否要使用一些專案任務管理工具,比如 Jira 或 Tower 等;
  • 是否要使用一些文件知識管理工具,比如 Confluence 等;
  • 選擇什麼樣的開發模式,是敏捷開發還是傳統瀑布開發;
  • 制定各種會議制度,比如固定的晨會、週會、總結會等;
  • 規劃分支使用的流程,程式碼稽核的流程;
  • 測試如何進行,選用什麼樣的 Bug 管理平臺,Bug 的分級等;
  • 和公司其他部門定期同步並討論專案總體計劃流程。

建立溝通匯報流程:

  • 規劃日常對內、對外 IM 溝通工具和郵件使用的規則;
  • 確定日常工作流程(評審、提測、釋出、上線);
  • 制定每一個團隊成員的日報或週報的模板。

績效管理:

績效管理如何來做,選擇 OKR 還是 KPI ?大家有太多討論和不同意見。在 TGO 鯤鵬會的小組活動中,我們組員也經常會針對這個話題討論,每一個公司都有不同的做法,這和公司層面的文化、背景、專案屬性、甚至是管理層的性格都有關係,無法完全照搬別人的做法。

我認為一個相對成熟的公司,適合公司的績效管理方式必不可少,需要不斷探索。一般而言,考核是用來激勵那些不太優秀的人,特別優秀的人才無論如何考核,他們永遠都是是衝在最前面的一批人。但是,任何公司都不可能做到 100% 的員工都有合夥人的心態和衝勁,也不可能 100% 的員工都是世界一流人才。所以,幫助所有員工建立清晰的目標並且進行回顧和考核非常重要,要讓所有人的目標都是清晰、具體且正確的。

技術需要標準化

各個環境標準化:

  • 定義明確 Dev 、QA 、Staging 、Live 環境的作用、每個人的許可權,以及每一個環境的使用方式;
  • 建立一套統一的釋出系統來處理日常釋出。比如,可以封裝 Shell 指令碼或 Jenkins ,並且明確線上上釋出事中事後,包括:運維、開發、測試、產品等每一個應該負責的點。

建立技術標準規範:

  • PRD 產品需求文件和 UI 標註的標準;
  • 開發標準,比如,可以在阿里的 Java 開發規範基礎上和大家一起討論,總結出符合自己公司需求的開發標準,並且通過程式碼規範外掛來約束;
  • 概要設計文件的標準,文件必須包含哪些點,什麼時候提交評審;
  • 概要設計時錶結構和服務定義的標準,各種中介軟體使用方式的標準和最佳實踐;
  • 自測標準,單元測試的要求,自測不完善測試打回的懲罰等;
  • CMDB 的建立、伺服器配置,作業系統基礎配置,程式安裝方式的運維標準化。隨著時間的推移可以總結出適合自己團隊標準或最佳實踐,所有的標準應該是所有團隊成員共同認可和遵循的,可以定期就這些標準進行回顧和討論。

建立監控管理制度:

  • 搭建日誌、監控報警基礎設施。比如,可以使用 ELK 、Grafana 、InfluxDb 等來搭建;
  • 統一公司的日誌、打點框架,規範明確專案的日誌和打點標準;
  • 為各個業務建立監控皮膚和報警規則,明確報警處理標準;
  • 定義事故分級流程,覆盤方法以及追責方式;
  • 定義運維日常監控容量巡檢方式以及應急響應預案。

1+ 的高速發展階段

隨著業務規模的擴大,很可能有了多條產品線;隨著團隊規模的擴大,徹底扁平化的組織架構可能無法滿足需要;隨著訪問量的增大,對技術和架構的要求也越來越多。這種情況,不管是對技術的要求還是對管理的要求都更上一層樓,這個時候需要在標準的基礎上再做一些管理和組織結構的演進,站在更高的角度管理去思考。(這個時候做一些細枝末節的工作對於整體的意義就不大了)。

技術方面的昇華

隨著公司的發展,產品要麼形態豐富,各種產品和業務衍生出來,要麼產品形態不變,訪問量急劇增大。對於前者,管理方面很容易犯的一個錯誤就是簡單的進行業務線的拆分和招人、招人、招人,形成 N*20 個這樣的團隊,每一個團隊之間相對獨立,技術沒有沉澱。對於後者,很容易犯的錯誤是通過堆伺服器和堆運維來抵擋壓力的上升,導致技術架構老舊問題增多。這種粗曠風格的團隊擴張是不太健康的,更好的方法還是多折騰:

  1. 我的建議是通過進行技術和組織架構的調整,形成專才,形成縱向技術線,把通用技術提煉出來,讓整個公司都可以積累統一的、能夠向前發展的技術平臺;
  2. 強制通過自動化手段把人解放出來,人應該去做創造性的工作;
  3. 消除團隊安逸的狀態,讓團隊或業務線之間形成競爭,保持衝勁。

組織架構調整

隨著業務規模的擴大,團隊規模也在擴大,僅僅對業務線的技術團隊進行橫向拆分( X 維度拆分 )還不夠,還需要有專門的垂直團隊服務於橫向的業務團隊。通過建立架構、中介軟體、運維等垂直團隊服務於所有業務團隊,確保技術和架構的統一( Y 維度拆分 )。

如果團隊人數超過 20 不足 50 ,我們需要增加經理層來管理一線員工,變為三層架構,如果人數超過 50 不足 100 ,我們需要增加高階經理來管理經理,變為四層架構( Z 維度拆分 )。當然,可能還會形成一些虛擬的或實際的技術或專案管理委員會,對技術人員的發展、技術的標準化、公司層面的技術大任務進行定義和協調。

補充以下幾點:

  1. 隨著層級的增多,管理者對於一線員工的觸達會越來越難,可能導致執行效率降低。這個時候,對下屬主管的任用和管理非常重要。與管理一線員工相同的是,主管也需要績效考核和標準,不同的是,主管們承擔了管理職務,一線員工是由他們直接管理和影響的,此時對於主管的培養非常重要。不僅僅要讓他們使用 CTO 原先定的標準和套路來管理,更多的是讓主管明確意識到自己的管理職責,激發出他們自己的管理風格;
  2. 在確保主管被充分授權,並且有團隊管理自治性的同時,最好提供一個通道,讓一線員工有機會表現和表達自己的想法,讓高層管理者可以瞭解到任何一名員工的想法,保持公正透明;
  3. 在公司這個階段,可以和人事一起把人員的職級要求和薪資標準進行統一定義,要和績效考核結合起來,形成固定週期的職級調整方案,形成明確的上升通道。讓每一位成員意識到只要通過自己的努力,在公司內部同樣可以走的很遠;
  4. 業務團隊和平臺架構團隊的目標使命不同,會存在一些矛盾存在。作為 CTO 要做好引導,讓業務團隊認識到架構統一的重要性,讓架構團隊認識到業務團隊的壓力。也可以鼓勵團隊之間的人員換崗以及做一些技術團隊的培訓,讓架構團隊理解業務,讓業務團隊深挖技術。

建立文化

人畢竟是社會動物,是有感情的,如果公司所有的管理手段都是硬手段,員工很難從內心認可。我們可以和 HRBP 配合,打造有團隊特色的技術文化。比如,分享文化、開源文化、學習文化、鼓勵自動化的文化等。

我們可以建立技術團隊的微信公眾號,讓所有人一起來發文和運營。可以把自研的專案開源出去貢獻給社群,讓社群一起來完善,可以組織定期的公司內部或公司與公司之間的技術培訓或交流,組織一年一度的技術之星、產品之星評選等等。初期可以通過使用一定的獎勵激勵手段來傳播固定技術文化,形成文化後,每一位團隊成員會覺得工作不僅僅是完成個人的任務,而是在一個集體中成長,在團隊中生活,有歸屬感價值感。

建立價值觀

一般而言公司層面會提煉出 3 - 5 項重要的價值觀,技術團隊也可以在此基礎上細化、提煉技術方面的價值觀,並納入考核。

個人認為價值觀一方面可以給我們定一個大方向,比如,我們需要怎麼樣的人;另一方面又類似於心理暗示,潛移默化的影響每一位員工。慢慢地,員工會演變為符合公司價值觀的人(變得和公司有“夫妻相”),或者意識到無法適應價值觀而主動離職。比如,如果可以定義一專多能、主動承擔、勇於創新、言出必行作為技術團隊的價值觀,並且展開列出一些子項納入考核。即使員工的業務能力沒問題,但日常的表現不符合價值觀,那麼他只能是一個過客,無法和公司一起發展,這也是為什麼很多大公司如此強調價值觀的原因。

團隊規模小的時候,我們只要自己衝在前線就可以很好的管理團隊,在規模中等的時候我們可以利用一些標準和制度進行管理,在規模更大了以後,我們需要更高維度的文化價值觀等手段來感染到每一個員工,讓員工認同公司,這比約束命令式管理更有效。

處於這個階段的公司,CTO 不僅要做好對內的管理工作,還要抽出時間做一些對外的工作,來幫助公司做品牌宣傳,並且用技術爭取更好的資源,比如,定期和同行以及投資人交流,組織參與一些技術討論,跟進行業趨勢等。

最後,想聊聊技術如何服務於公司戰略?

就我個人而言,我覺得兩點很重要,一是堅持,二是應變,三是要思考。圍繞這幾點,我列了一些技術服務公司戰略的要點。

產品技術部門最基礎的職責

作為產品技術團隊,最本職的工作還是持續高效輸出高質量、高可靠的產品,滿足公司的業務需要。並且在不斷提高可用性的同時,通過自動化、標準化提高效率,節省人力成本。在組織規模變大了以後,還能通過管理手段來保持團隊的高效。隨著業務和團隊規模擴大,做到這幾點並不容易,但這只是技術服務於公司戰略的基本要求。

以技術創新把不可能變為可能

舉個例子,有一次,業務給我提了一個需求,因為受到底層外部介面的限制,這個需求無法實現。但是業務表示,為什麼別的公司可以實現,我們就不行。這時候,我才花時間去認真思考是否有一些突破的辦法,嘗試找到別人的實現方式,最後想到了可以繞開限制的方式,把這個專案實現了。我沒想到的是,專案上線後業務告知當時問錯了,其實別人也無法實現這個東西,因為只有我們實現了這個技術,所以很多人都願意來找我們合作。

很多時候,我會認為自己有十幾年的技術研發經驗,我對公司既有技術足夠理解,我以為我可以對一件事情是否可以實現很快下結論。其實這是不對的,在收到外部需求的時候,應該反過來思考,先假設這個需求是必須實現的,或者競品已經實現了的,在拒絕別人之前,給自己幾天時間,給團隊幾天時間來想一下怎麼去實現,如果你做到了別人做不到的,那麼你的技術就是核心競爭力。

建立一支可以打快戰的鐵軍技術團隊

隨著公司技術的標準化和成熟,團隊應該 具有打快戰的能力,但是穩定的業務往往會讓老兵們進入溫水煮青蛙的狀態。作為技術管理者,應該用各種手段來激勵大家的鬥志(比如搞階段性的重構、黑客馬拉松比賽),保持團隊的活力。這樣,如果有新開闢的專案,可以在公司內部輕鬆找到並形成一支敢死隊來參與戰鬥,超高的執行力使得新業務可以儘快進行低成本試錯或搶佔市場,這也是技術產品團隊成熟於否的體現。

根據戰略及時調整團隊架構和技術架構

不管是團隊架構還是技術架構應該有一定時間的先行,一般而言對於線性發展的專案,公司目前如果處於 A 量級的 PV ,就應該開始儲備十倍 A 量級 PV 的架構。根據業務的發展估算技術架構的挑戰,提前半年或者一年進行新一代架構方案的確立,確保技術不拖業務後腿。團隊架構也是同樣需要先定義骨架,再在每一個可能的職位上進行填坑招聘。技術管理者需要對公司的戰略敏感,根據公司的發展和戰略,提前做好這兩個架構調整的準備,並在需要的時候及時應用調整。

提煉核心技術,產品化產品,探索進行產品輸出的可能

如果做的是 2C 的產品,在一個領域做了多年或許就有能力把核心技術或產品提煉出一套 2B 或 SaaS 的產品來賣,如果成功,這就不僅僅是一個 2C 的產品,很可能又多出一套 2B 的產品甚至是一套 2C 的平臺。如果做的是 2B 的產品,或許就要思考一下,現在的產品是複製貼上的定製化產品還是完全配置的產品化產品,如果不是,怎麼讓他更通用地進行產品化,減少人力成本。產品化平臺化的過程是一個痛苦的抽象過程,對技術的要求更高,不過一旦實現就可以讓公司的使用者和規模得到爆發式發展,真正的技術改變戰略。

關注前沿技術,思考前沿技術和公司業務的結合

目前正處在技術變革的一個關鍵階段,在未來 5 年內,垂直細分的 AI 將會變得成熟,區塊鏈也可能會出現大量的實際應用,技術管理者應該時刻關注這些技術,不斷思考可能的結合場景。這個世上不缺愛思考的人,但很多懂業務的人不懂技術,懂技術的人又不能理解業務痛點,只要積極關注前沿技術並和業務專家保持討論溝通,說不定哪天就會碰撞出具有革命性的產品。

- End -


相關文章