EnriqueMark
隨筆

全端與跨領域的學習科學

2026-04 繁體中文

我最近確實是發現了,全端開發確實能讓人洞察到更多東西,尤其是那些前端和後端分別不同的坑和雷點。前端的bug有時候純粹是後端背鍋,比如出錯了卻只説出錯,而完全不提為什麼出錯,導致前端除錯除的寸步難行。或者反過來,前端報錯,後端什麼都不清楚,卻「感覺」似乎是後端的問題,結果找半天發現方向錯誤。這些東西只有兩個領域都待過才能知道,其中的「領域知識」需要實際的操作過才能明白。光看文字而沒有實際體會過那種痛苦,就會始終隔著層紗。尤其是當我需要付出真實的成本去考量前後端開發時,就更是如此。只有自己體會過那段痛苦,才會有意的在開發時進行最佳化,付出額外的精力去顧及可能「不屬於自己」的問題。

甩鍋不是個好習慣,也許開發者自身是沒有惡意的,但是懶惰會讓人下意識節省掉一些本該有的東西,進而造成配合方的不便。往往為了剋制這種懶惰,要麼會使用制度來強制要求某些開發規則,要麼就是靠自律——而後者是最難的。這也是踩坑帶來的最大加成,它會讓你下意識去自律,不是我想這麼做,而是不這麼做我真的會痛苦萬分。只有debug de到力竭的人才能體會到那種想怒噴前/後端祖宗十八代的感覺:你就加個log,幾行程式碼的事兒,為啥不給我弄上。雙方都這麼想,結果就是互相給對方上強度。當然有些情況可能是企業制度的原因,但從個人的角度看,可以在制度之外將標準做法內化,正是技術能力的體現之一。

拋開靈活性,另一方面我覺得是洞察:知識的跨領域再現。我目前在前後端使用的都是強型別語言,TS+C#的組合也讓我看到許多共同的設計原則。比如DI,TS在做法上和C#幾乎是一致的,也意味著我可以同時在前後端使用這種模式。亦或者是關於泛型,這對任何強型別的語言來説都是一致的。也許有人會覺得,這和全端開發不盡然相關,更多的是語言問題。但當前後端前後端使用的語言和框架都不同時,正是全端開發給我提供了這種跨語言的理解環境。否則下意識泡在舒適區的任何人,恐怕都不會每天深度在多個語言之間切換。只有工作上的要求會迫使我寫完了TS前端再去看C#後端——而我在個人專案上都是TS一條龍穿到底,前端用React後端用nestJS的,誰會換另一個語言給自己找麻煩。

跨領域的再現有時會給人一種明確的「頓悟」感,我蠻享受這種感覺的。我們常説「看山不是山」,但具體如何體會卻總被認為是可遇不可求的。但我認為,這種感覺完全是可以是自己主動去製造出來的產物——關鍵便是主動的嘗試和跨領域,並用已有領域的內容來看新領域,並嘗試尋找可以遷移的知識。從學習科學的角度來説,這正是重構大腦神經連結,搭建自身知識網路的過程。和教科書不同,大部分真實知識從來都不是綫性、結構分明、體系明確的(數學可能例外),而是更傾向於來回跳躍。教科書上的知識也許是ABCDE,但到了具體完全可以是A到C到E最終才會回到B。因為工程上我們總是遇到了問題才會再去考慮這東西到底是啥,應用領先於理論,而應用上的我呢提也會成為我接觸理論的動機和出發點。最終我掌握了理論的目的也是要讓其回饋到我的工程上去,不像學校是為了應付考試。

另一個概念是「默會知識」或者説「隱性知識」。它正是一種讓人難以捉摸而大多存在於人之感覺中的只是。難以成文化,而只能靠工程師的經驗或直覺來把握的存在。像這種知識,在我看來體現的正是知識結構網路本身——不是以邏輯,而是以結構為存在的知識形式。隱性知識是對知識結構的把握。這種結構有時候難以言説,但卻真實的儲存在我的大腦之中。當需要時,從一個入口(訊號)開始,我會逐漸啟用整個網路,進而向前端推送出那種感覺。而這一網路是需要在不斷地互動和實踐踩坑中去獲取的。除此之外,搭建網路的另一個有效方法,便是跨領域的知識遷移。

通過遷移,知識在不同的新領域(生理上來説可以是新的神經組成)構建連結,進而湧現出此前未曾察覺的新內容。當兩個原先區隔的知識碰撞和互動時,新的知識也會在其中生成——而他們不盡然是可以言説的,也當然存在哪些作為「感覺」而存在的知識。

同時,不斷地遷移過程中,我自身關於「如何學習」的元能力也會得到訓練。每次遷移,我對這種跨領域就會適應一份,進而我的思維也越不會被已有的知識結構和體系限制。每次遷移,我所學到的東西都可能會和我預料不到的已有知識結構發生碰撞,進而源源不斷的產生連我自己都無法得知的新東西。只有跨領域能給人這種頻繁的「見山不是山」的體驗,這是長期浸泡在單一領域難以體會的。

跨領域時常被人反對的一點就是深度和廣度的取捨。但我覺得這裡不完全是矛盾的——深度和廣度可以互相促進。精力有限,我當然難以兼顧廣度和深度。但是擁有極其廣度知識的情況下卻能培養我的另一個能力——那就是學習的能力。同時,無論是前後端,事實上又都同屬於一個領域,即電腦科學。作為子領域來説,前後端的確是區分的,但他們又共同依賴著電腦科學這個大領域的知識主題。所以這裡的知識結構就會體現為大的套小的,小的再套更小的。前後端,就其知識本身來説有不少都是共通的。而這種共通也會加速我學習想要學習的指定領域之知識的速度。

就拿前端來説,有些人會認為知識的深度體現為對框架和工具的使用,或者是前端最佳化、實作中具體操作的標準解法。但是,高難度的前端當然不只是切版:效能調優、網路協議、甚至部分後端的高並發與資料結構、演算法等等,這些不是全部,但也都是前端深度知識的構成之一。我們都説前端一年一變,可即便如此,也總有些知識能夠儲存下來——比如跨框架共通的設計原則——一旦吃透,那麼我就可以快速掌握到深度之中。當我轉換框架時,實際上已經進行了一次前端內部的「跨領域」知識遷移。只是跨的幅度不大,有時候讓人難以察覺而已。

但是,如果我本就擁有經常跨領域的經驗,必然會很快察覺到這裡的共通性之所在。所謂的第一性的那些東西,往往都是共通的東西。如果說,長久的跨領域培養了我對第一性的洞察和學習能力,那麼我對所謂「深度」知識的掌握速度,也會遠遠大於一個多年泡在單一領域的人。一個多年前端可能對某些具體的專精知識鑽研的極深,我當然認為這樣的人是值得尊重且至關重要的。但是我們對大多數人來説,我不需要知道V8框架的某個深層細節到底是啥,而需要的是快速的工程能力——即達到工程可用的深度,這才是企業所需要的。那麼,如果我具備這種快速學習的能力,那我達到深度的效率也會讓我在需要的時候切換狀態,從廣度馬上轉換為「可用的深度」。因此,與其擔憂「廣度影響深度」,不如轉換視角,思考這樣一點:「我真的需要那麼多深度嗎?」

往往説這句話的人,他們看向的是專家,而不是可用的、深度的工程師。比起前者,企業在量上反而更需要後者。除非真的是特別要求專家知識的行業,或者就立志要進入到對專家深度有明確要求的崗位,否則「廣度」對個人的加成都始終是正向的,而非是像世人嘲諷的那般,所謂「多而不精」。因為他們只看到了「多」,卻忽略了更本質的層面——如何多?拉開差距的正是學習能力,一個「多」者必然有其自身的快速學習方法論,否則他不可能掌握那麼多。而一個能夠快速學習,掌握了「元學習技巧」的人,更能夠在需要的時候切換為「深度」的狀態,而且還可以是「多個領域的深度」。他之所以無法達到專家是因為精力和時間有限——但如果,他中途決定轉換道路或精深某一領域。他追趕並成為專家的速度和效率,也會超過那些長期只在單一領域待過的人。至少在這裡,「多」從不天然成為被嘲諷的「劣勢」,「如何多」才是關鍵。

如果我具備了能快速成為此類人的能力,自然就具備了更多的機會。跨領域作為一種優勢被如此嘲弄,反而磨滅了真正能夠創造價值的能力。一個有效的工具被「認為」是低效的,從工程角度來説,這毫無疑問是浪費。並且在我看來,之所以它會被這麼認為,恰恰是因為大多做出此類判斷的人缺少跨領域的知識——比如我就是從「學習科學」的角度來論證這件事的,若他從未接觸過學習科學,他當然就看不到這樣的角度。這至少就表明了拓展知識帶來的附加效果,有時候角度本身就很重要。