前端有邊界,但人沒有——從零到一打造一款產品
TL;DR。請備好咖啡。
前端永遠都在
我一直都不是特別認同“前端”或者“後端”這種title,如果要區分職責的話,我覺得使用者端和服務端工程師更合適。
有人說:“前端已死”。
我覺得大家完全沒有必要沮喪,這些話全無價值,社會在變遷,我們身處其中,埋頭苦幹的閒暇之餘,也不妨擡頭,看一看天空,想一想,我們能做什麼?
坦白說,我個人是不認同人的價值是來源於社會的這種說法的,這否定了人的存在,但市場經濟主導的社會,大部分人(n代除外)的價值確實只能來源於ta所處的環境以及在這個環境中,他所能做到的事情,你可以把它看作是市場對人的“馴化”,對人的“工具化”和“貨幣化”。
你反感它,但不妨礙你利用這種社會規則去實現你的個人價值。
現在,有一種叫做“前端開發”的貨幣,它貶值了,為什麼貶值呢?因為市場對它的需求大幅度減少了。為什麼減少?因為經濟進入下行週期,疊加上世界不穩定因素,市場上的資方看不清未來,對未來沒有信心。
那很多巨集觀上的因素我們無力改變,我們唯一能做的,就是改變自己。
如果你不想隨便就被裁,隨意被別人代替,不想時刻面對著年齡的威脅,不想要那種焦慮。
就必須主動改變,這種改變可能會很痛苦,你得學習更多的知識,擴充自己的思維模型,減少甚至放棄娛樂時間,去根據自己習得的新知識,去實踐,去沉澱出自己的思考。
最重要的,也是我不認同國內很多崗位title的原因(這些title大部分都是把人螺絲釘化工具化的叫法):不要給自己設邊界。
人的能力沒有邊界。
如果你看過《刻意練習》並實踐過其理念,並有過超過一年的刻意練習經歷,你會發現,人的身體,還有人腦是沒有邊界的,在任何一個領域,你永遠可以比上一秒的你做到更好,只要你願意付出精力和思考。
前端的優勢
有人說,前端受制於後端,升職加薪都是後端的,前端只能分點湯湯水水。
坦白講,出現上面這種情況你得思考一下,為什麼你只能分到“湯湯水水”,是業務模式決定的,還是你沒有體現出自己的價值?
事實上,大部分前端工作沒有唯一價值,什麼是唯一價值?就是這個事情,就必須得你來做,才做得好,產出的程式碼或者產品是一個“藝術作品”,具備獨特業務價值和審美價值。
而不是複製貼上的產物。
我是從設計入門的前端,喜歡設計,所以選擇從事前端方面的工作,後面不停地折騰,想要活得體面點,從北京到了杭州。想要去大廠,面過阿里、位元組、快手,都草草了之。
原因很簡單,我不刷題,不搞演算法,不背八股,不閱讀框架原始碼,我研究的很多東西都是領域性質的,是如何做好一個產品,如何做架構更加優雅和具有拓展性。
我說我懂設計,懂產品,懂架構,面試官都一臉問號。
你只是一個前端開發,你懂個P的設計和產品,設計和產品有專門的產品經理。
投了很多,面了很多,我也在思考,去大廠996甚至007,一年多掙十萬,是不是真的那麼重要,還是說,我看中的是大廠的名氣,想要被人羨慕和仰望?
思考了很久,我決定不去主動追求大廠了,大廠要的,我給不了,我有的,大廠沒法接受。
想通之後,我難受了很久,這就是現實,現實往往難以讓人接受,但成年人必須要學會擁抱現實,但依然要熱愛生活,不被現實捕獲,避免變得庸俗。
來杭州之後,可以說,杭州的小公司,基本沒有正常的,幾經輾轉,不得不一年換一家。後來,在杭州一家做微商的小公司工作了一段時間,一個人全身心投入開發了三個月的產品因為領導之間的博弈成了犧牲品,沒上線就胎死腹中。
我的心在滴血。
這觸碰了我的底線,我不允許我的精力和三個月的時間被這樣浪費,於是毅然決然選擇離職。然後聯絡了北京曾經的領導平哥,看看有沒有什麼工作機會,因為在他那,我有感覺到被尊重,感覺的自己的價值沒有被浪費,我在的時候公司畢竟就四個員工,三個開發,後來寫php那哥們和平哥吵架走了,就我們兩個開發,平哥是php後端,我是設計+前端。
畢業之後我在北京待了一年,其實當時剛畢業的時候面試進了銳安科技這家公司,做一些安保科技方面的工作。銳安算是半個國企,這裡的人以待的久為驕傲,待得越久資歷越老,滿額公積金,條件待遇對於一個剛畢業的學生可以說不錯,工作也不累,但是每天加班到9、10點,是可以幹到死的公司(適合混吃等死或者不想要參與社會競爭的人)。技術是十年前的(保守說法),公司內部不允許連外網,而且有訊號干擾器,而且經常出大差,後來我作為一個新人,出差的任務理所應當的任務交給我了,去南寧出差了一個月,駐地開發,回來的時候像個野人了,最讓我接受不了的是,帶我的人拿自己十年前過時的開發理念教你寫程式碼(我的程式碼能力和設計能力不一定比他低),而且控制慾還有點強,這就很膈應人了,轉正後一週,十一前夕我提交了辭呈,為了避免尷尬,我只說家庭原因,家人想要我回去考研,不提及任何個人或者其他人的因素。
然後就是找工作,找了兩個月沒找到合適的,當時還是太年輕了,對有些公司還挑三揀四的,這樣錯過了最佳的面試的時機(逐漸沒錢之後人開始焦慮起來了,狀態不行了),最後沒錢了,找家裡要了幾千塊錢,聽我爸說是臨時找人借的,我掛掉電話之後,崩潰了,10歲之後再也沒有哭過,但那一刻我眼睛紅了,沒有淚水,望著天花板,過了好久。
我必須堅強,我沒有退路。那個時候我發誓,再也不會找爸媽要一分錢,也不會接受他們的任何一分錢。
於是開始亂投,甚至面過設計師,面過產品經理,然後投給了平哥的公司,讓上機開卷面試,只要藉助網際網路寫個表單提交邏輯就OK了,就一個表單邏輯,我寫了兩個小時。
這兩個小時是我人生中度過的最快的時間。
這一年就是在平哥的公司做外包,那時候想的很簡單,多做,多想,多看(如果有應屆畢業生實在找不到正經工作,可以嘗試到外包歷練一番,還是比較鍛鍊人的,當然,要有向上突破的心)。
我心裡是有一個職業目標的,要有獨立做產品的能力,所有的一切都可以為之而妥協和努力。
後來公司自營社交電商(當時是19年)失敗了,我離開了公司去了杭州。我離開公司一年後,恰逢疫情,他把公司關了一年,這一年他也思考了很多,知道外包這條路走不遠,之前我們內部就有一個類似Laravel架構的Php程式碼生成器,結合他給別人做諮詢時做的技術方案用Golang實現了一個架子,搞了一個應用引擎,後來才知道,外面的人管這個叫低程式碼。
時間是2021年9月,這個時候他在籌劃介面引擎的部分,這個時候我找上了他,我按照他的要求兩個月用React、Umi、Ant Design實現了一個MVP版本的介面引擎,
因為恰好我來杭州之後的這幾年,一直都有在用Umi做後臺管理系統,就是Ant Design Pro+Umi那一套,甚至Ant Design都被我磨改出好幾種主題,做了大概10套左右的這種業務系統,單個業務系統,多的可能有50+業務模組,少的至少也有20個模組。
這裡要講個故事,來自於《莊子》天地篇:
有一天,孔子的弟子看到子貢看到一個老人家在地裡,用人力在進行灌溉苗圃(培育樹木幼株或某些農作物幼苗的園地),於是子貢對老人說:“有一種機械,一天能灌溉一百某地”。
灌溉苗圃的老人聽了面起怒色,卻笑著說:
“我從我的老師那裡聽說過,使用機械的人必定從事機務之事;從事機務之事的人必然要存“機心”。“機心”一旦存於心中,那純粹樸素的天性就不完備了。純粹樸素的天性一旦沒有了,精神就會搖擺不定。一旦精神搖擺不定,便不能夠承載大道了。我並非不知道那個東西,只是恥於去做罷了。”
老人的意思是,你說的那個機械,我還要學習一大堆的東西才能用,老人這個年紀種這麼點田,人力完全能夠所及,可能種田只是老人家的一個樂趣,“承載大道”。
我的理解是,違了本心去追求形式,承受一大堆不必要的資訊,把心搞亂了,卻失去了初心,是不可取的。
也不能違背自然規律,老想著投機取巧,往往得不償失。
事物發展講究一個自然而然,順勢而為。
除機心。
我沒有去研究過任何低程式碼的東西(甚至還是幾個月後,有人告訴我低程式碼這個概念),就完全按照“第一性原理”——這個實現能不能加速業務開發,把這個介面引擎開發出來了,我一直堅信的就是,在擁有充足自信的前提條件下,每個人都可以最大限度發揮自己的創作能力,千萬不要在自己還沒有具體想法的時候就去看別人的產品,那會產生路徑依賴,也是自尋死路(產品上限釘死了)。
後面我吸取了之前的經驗,用DDD的思想,拋棄掉Dva轉而使用Mobx+Tsyringe(依賴注入庫),花三個月的時間把它重構了,把介面引擎從邏輯驅動改成了基於模型驅動(靈感來源於《遊戲引擎架構》這本書,軟體架構師的必讀書籍之一),便於後期業務拓展。在這個過程中,我刻意不去看任何類似產品的實現,因為我知道,萬變不離其宗,我掌握了實現原理,不能被其他產品影響了我的審美和判斷。
這是我認為的“去機心”。
後來有人跟我們說,你這個叫低程式碼,我們才恍然大悟。哦,原來這就是“低程式碼”。
當然,我後面要分享和打造的產品和上訴沒啥關係,只是,我想告訴你的是,前端事實上是沒有邊界的。
前端的邊界就是人的邊界。
前端的優勢在於,你離使用者比較近,你如果懂設計、產品,使用者心理和使用者需求,相比於後端開發者,你能比較容易的打造出獨立產品的。
如果你熟練掌握Nodejs,知道怎麼使用serverless服務,現在,你已經具備成為獨立開發者的條件之二了。
我是從2021年10月開始遠端工作的,公司在北京,我在杭州。疫情三年,沒打過疫苗,核酸檢測總次數不超過10次(回過兩次家)。
隱隱有種預感,這種不穩定的狀態可能會持續超過10年。
在最精彩的年齡遇上這樣一個世界,著實倒了血黴。但抱怨沒有用,得做出改變,迎接不確定拉滿的未來。
“大浪淘沙”(指網際網路時代落下帷幕,大量開發者不得不面臨生存問題),也會催生人人都是獨立開發者的新時代,前端在這塊是比較有優勢的。
做產品需要什麼
前端開發者如果想要打造一款產品,首先得問自己一個問題:我能做什麼?而不是我想做什麼。
事實上,你的idea一文不值。
我的錘子便籤裡面有從大學以來(將近10年)643條的記錄,Microsoft Todo裡面超過609條關於各種產品的想法,但99%的想法都躺在那裡,不是說那些想法沒有價值,而是你沒有資源和能力去讓它成為你想象中的產品。
這就好像,你夢到了一段非常好聽的旋律,但你不會鋼琴,不會吉他或者任何樂器,基本的樂理你都不懂,甚至你都不知道像FL Studio這樣的DAW(數位音樂工作站)是什麼,這意味著,你沒有一條通往想法實現的路徑。
所以,對於獨立開發者,量力而行是關鍵。
前面說過,前端開發的優勢是離使用者近,離設計和產品近,單純的前端技術是沒法做出好產品的。React再好用,Ant Design再便捷,Umi再方便,如果你沒有對於產品的認知,對於設計的理解,對於人和人的需求的認知,沒有一個不錯的審美,以及摳細節的精神,那也是沒法做出企業級的商業產品的。
看到這裡你也不要擔心自己做不做的出來一款產品,我給個建議,這個時候不要聽從外界的任何聲音,只管做,從小處開始,別一上來頭腦一熱就想搞個大的,這種一般你的熱情減退就把你搞沮喪了。
做了就有價值。
這是一個趟坑和追求完美的過程,每一步,都有價值,都可以讓你後面的新產品做的更好、更快。
不要害怕失敗,要敢於失敗,快速驗證,快速失敗,如果不行,就推倒重來,在刻意練習的過程中,“重開”是一個遞迴優化的過程,把你自己想象成AI,這就是一個機器學習不斷矯正模型準確性的過程。
Work like a machine, Think like a human。像機器一樣工作,像人一樣思考。
我熱衷於玩各種模擬經營遊戲,比如《缺氧》、《Surviving Mars》、《文明6》、《Factorio》、《東方帝國》、《全戰三國》、《冰汽時代》、《紀元1800》,開啟Steam和Epic那麼一看,我玩過的模擬經營類都數不過來了,有時開啟PC,往那一坐,就是一整天,從早上10點到晚上12點,甚至一天一夜也是有過的。
到我這個年紀,什麼遊戲都玩過了,享受過了,現在玩遊戲都是帶著思考在玩,不能為了玩而玩,玩遊戲也能領悟到很多東西,比如經濟是如何運轉的,資源如何調配,系統的穩定如何維持,甚至從遊戲中能窺得人性,以小見大,這些東西都能擴充你的思維模型,輻射你對於現實社會的認知。
最享受的就是重開,有時候發現前期規劃出了點問題,我會直接放棄可能花了半天的運營成果,直接重開,每一次重開,你能避免很多錯誤決策,優化物流線路,優化運輸管道,優化資源配比,優化建築佈局,優化人口數量,優化作戰策略...,看著不斷髮展壯大的,運轉順暢的,從你手中構建出來的虛擬社會,這種成就感讓你樂此不疲。
重開即進步。
做獨立產品,其實你最不用擔心的就是能力問題,產品、設計還有對理解人和人的需求的能力其實比想象中容易獲得,按照刻意練習,潛意識學習的行為模式,你在心裡安一個巨集觀目標,這個目標是那種很遠大的目標,得具體,得是一種實現,而非金錢或者物質標的,比如:我要打造一個去中心化的服務引擎。
牢記這個目標,你的大腦會在潛意識中自動收集相關資料,比如去中心化引擎什麼語言合適Go、Rust?,Go有哪些優缺點,Rust有哪些優缺點,你會有意識的進行對比,最後經過一番研究調查你發現(不要專門花時間去研究,看到哪學到哪),Go的GC Heap問題讓Go沒有比Rust更適合作為基礎設施軟體的條件,Go淘汰,確定Rust,這樣一個潛意識的學習、篩選資訊的過程。
每隔一段時間回顧一下你新習得的知識和技能,看看如何運用到你的目標上,如果有想法,一定要立刻把它記下來。
最後可能你的想法大部分都沒有實現,但在這個過程中你學到了很多。
真正偉大的產品,都是日常生活中無數個想法和靈感的相互作用產生出來的,每一個產品在正式開始開發之前,可能需要上千次資訊的收集和篩選。
如何從零到一打造一款產品,以todo為例
感受痛點,尋求解決方案
需求分析階段,羅列功能。
每一門框架的模版,都是todo,那這裡我也以todo為例。
首先分析你要的做的產品,它是什麼,它從哪裡來,要到哪去?
研究todo,就不得不提一個概念——“GTD”,GTD是“Get Things Done”,把事情做完(好)的縮寫。如果你研究GTD的相關文獻,你會發現,講todo驅動概念的書籍和概念數不勝數,如果你沒時間或者興趣去看那些論文,那麼用“第一性原理”來分解GTD,GTD的目的是把事情做完,把事情做好,那麼把一件事情做完需要什麼條件?把一件事情做好需要哪些條件?
這裡插一段關於我與GTD的經歷:
從初中開始,每天早上來到教室之後我會用鉛筆在課桌上右上角把今天要做的事情列成一個列表,做完一件事情就用橡皮擦擦掉一個,如果多的話,就會進行分類,對於一個比較複雜的事情就做任務分解,對於一個比較複雜的事情就做任務分解,分解成粒度比較小的任務,執行起來難度更低,但總任務是不變的,這個習慣一直持續到高中畢業。
記錄,執行,擦除(回顧),每執行一遍這個過程,你會獲得一點點的成就感,不要小看這一點的成就感,它會驅動你一直往前走的,而且是有計劃的走,這對於做一些比較大的時間週期比較長的比較困難的事情,是必需的。
回到正題,GTD的核心其實滿足上述功能就能構成一個MVP(Minimum Viable Product:最小可行性產品)了:
- 支援記錄todo
- 支援勾選todo
- 支援todo分類
- 支援子任務
- 支援計劃任務
事實上,上述功能市面上流行的todo應用都能夠實現,那我要做的todo有什麼是上面滿足不了的呢,頭腦風暴一下:
- 互斥任務
- 分類任務
- 多Tab
- 任務列表支援新增參考資料
- 更加豐富的任務詳情
- 強大的文字編輯器
- 流程驅動
- 看板
- 白板
- 專案管理
- 去中心化資料同步
- 番茄鍾
- 表單和表格
- 開放api
- 支援呼叫api
可能有人會提Notion,Notion不是以GTD為核心的應用,它以內容為核心,不符合我要的GTD驅動內容的需求。
下面簡單講一下互斥任務。
互斥任務
這可以說是這個產品最大“特色”,事實上,我記錄todo的時候,對於一件事情,往往會有很多中實現方式,這些方式都是做這一件事情,以Microsoft Todo為例,如果想要記錄這些實現方式,要麼放在最外層同級任務,要麼放在子任務裡,或者放在那令人難受的備註內容區(2億刀做的產品,這種細節像坨Shit),但是這些都是不足以表達任務間關係的,在建立任務的時候,應該可以勾選一個選項,是否為互斥任務,勾選之後展開一個互斥任務列表,支援新增其他互斥任務,渲染的時候就會給這些互斥任務染上同一種顏色,並都放置在同一級別,這些互斥任務中的任意一個check了,其他的任務會自動進入關閉狀態。
這裡其實涉及到了一個概念,互斥任務,不僅僅有checked、unchecked,還有一個closed狀態,這個closed狀態是不可修改,只有互斥任務中的已經被checke的任務被uncheck的時候,其他任務才會從closed狀態轉變為unchecked狀態。
這麼一搞,是不是複雜度瞬間上了一個量級,根據我做B端產品的經驗,業務複雜度有時候是業務包容度的體現。
做應用要做到,簡約,而不簡單。簡約是指讓使用者用起來沒有心理負擔,不需要學一堆東西,所有操作都是基於使用者習慣的;有時候一個個性化功能會導致系統複雜度指數級上升,但這個功能使用者可能用的並不多,但卻很必要,這個時候反過來想,是不是正是因為複雜度高使用場景才越多,才對使用者更友好,產品更有價值呢?
放幾張效果截圖:
還有很多細節,一股腦的講了,寫太長也沒人願意看,慢慢更新,這個系列將一直更新。如果有關於產品的更多想法,歡迎發展評論區或者找我單獨探討。我會在產品完成todo模組時釋出MVP,開放給大家使用。
後續文章
- 如何打造一個產品的品牌
- 競品分析
- 商業化路徑
- 技術選型
- 搭建應用框架
- 全域性功能模組的設計
- 實現一個最簡單的todo
- 在todo中支援多Tab、無限滾動和任務分類
- todo支援互斥任務
- yjs/pouchdb/rxdb/sqlite多端同步實踐
- 基於低程式碼技術的塊級編輯器的實現
- 實現一個別具一格的番茄鍾 ...