建可復(fù)用的開發(fā)者知識體系)
1. 從“眼前坑”到“技能庫”一次認(rèn)知升級的實(shí)踐上次我們聊了如何用AI快速解決一個具體的編碼問題——那個關(guān)于Spring Boot項(xiàng)目里L(fēng)ogback日志配置的“眼前坑”。問題解決了代碼跑通了日志也正常輸出了一切看起來都很美好。但故事到這里就結(jié)束了嗎對于大多數(shù)開發(fā)者來說可能就真的結(jié)束了。問題解決任務(wù)完成下一個。然而這正是我們與高效、專業(yè)的開發(fā)者之間產(chǎn)生差距的關(guān)鍵分水嶺。把AI給的解決方案直接復(fù)制粘貼進(jìn)項(xiàng)目然后關(guān)掉聊天窗口這就像在野外探險(xiǎn)時(shí)用一根臨時(shí)找到的木棍撬開了擋路的石頭走過去后就把木棍隨手一扔。下次再遇到類似的石頭你大概率還得重新找木棍甚至可能因?yàn)榈匦尾煌B找木棍的方法都忘了。而真正的“技能”是什么是把這次撬石頭的經(jīng)驗(yàn)總結(jié)成一套可復(fù)用的“杠桿原理使用手冊”和“常見巖石結(jié)構(gòu)分析”并把它放進(jìn)你的隨身工具箱里?!皩戇M(jìn)skills了”這短短幾個字背后代表的是從“一次性解決”到“系統(tǒng)性沉淀”的思維躍遷。它意味著你不再滿足于當(dāng)個“救火隊(duì)員”而是開始有意識地將散落的經(jīng)驗(yàn)點(diǎn)編織成一張可檢索、可復(fù)用、可演進(jìn)的知識網(wǎng)絡(luò)。但這個過程絕非簡單的“復(fù)制-粘貼-保存”。很多人以為把AI的答案存進(jìn)某個筆記軟件或代碼片段庫就叫“沉淀”了結(jié)果往往是建了一個雜亂無章的“垃圾堆”下次遇到問題依然想不起來用或者用的時(shí)候發(fā)現(xiàn)根本對不上。這就是“重建還是踩坑”的靈魂拷問你是在構(gòu)建一個真正能賦能未來的技能體系還是在為未來埋下更多混亂的種子本篇我們就以那個Spring Boot Logback的案例為引子深入聊聊如何將一次具體的AI答疑真正內(nèi)化為屬于你自己的、可操作的developer skills。這不僅僅是關(guān)于工具無論是OpenCode、Claude Code、Cursor還是任何AI助手的使用更關(guān)乎我們?nèi)绾闻c這些強(qiáng)大的“外腦”協(xié)作完成個人知識體系的迭代與重建。2. 技能沉淀的典型誤區(qū)為什么你的“收藏”從未生效在開始建設(shè)之前我們先得清掃一下常見的認(rèn)知誤區(qū)。這些誤區(qū)不破除我們很可能在“重建”的道路上一腳踏進(jìn)更深的“坑”。2.1 誤區(qū)一信息囤積等于知識掌握這是最普遍的現(xiàn)象??吹紸I給了一段完美的配置代碼趕緊CtrlCCtrlV到EverNote、Notion、OneNote或者一個叫“代碼片段”的文件夾里。心里頓時(shí)感到踏實(shí)“嗯這個知識我擁有了。” 但事實(shí)上你擁有的只是一串靜態(tài)的字符。你沒有經(jīng)歷調(diào)試它時(shí)遇到的編碼問題沒有思考過為什么include標(biāo)簽在這里比includefile更合適也沒有驗(yàn)證過在Spring Boot 2.x和3.x下它的行為是否一致。當(dāng)三個月后另一個項(xiàng)目需要類似功能時(shí)你很可能根本想不起來存過這個或者找到了卻發(fā)現(xiàn)環(huán)境不同代碼跑不起來于是你又去問了一遍AI。核心問題缺乏“處理”過程。知識的內(nèi)化需要經(jīng)過理解、重構(gòu)、關(guān)聯(lián)和實(shí)踐。單純的存儲只是把信息從AI的上下文搬到了你的硬盤它并沒有進(jìn)入你的大腦神經(jīng)網(wǎng)絡(luò)。2.2 誤區(qū)二脫離上下文的代碼片段繼續(xù)用Logback的例子。AI給出的答案可能是這樣的configuration include resourceorg/springframework/boot/logging/logback/base.xml/ property nameLOG_PATH value./logs/ appender nameFILE-ERROR classch.qos.logback.core.rolling.RollingFileAppender file${LOG_PATH}/error.log/file filter classch.qos.logback.classic.filter.LevelFilter levelERROR/level onMatchACCEPT/onMatch onMismatchDENY/onMismatch /filter encoder pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePattern${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log.gz/fileNamePattern maxHistory30/maxHistory timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize100MB/maxFileSize /timeBasedFileNamingAndTriggeringPolicy /rollingPolicy /appender root levelINFO appender-ref refFILE-ERROR/ /root /configuration如果你只保存這段代碼那么你只得到了“What”是什么。你丟失了“Why”為什么和“How”怎么用為什么用include引入base.xml因?yàn)檫@樣可以繼承Spring Boot默認(rèn)的日志配置如控制臺輸出格式、默認(rèn)的Logback配置你只需要覆蓋或新增自定義部分避免重復(fù)造輪子且與Spring Boot生態(tài)保持一致。LevelFilter里的ACCEPT和DENY是什么意思這是過濾器的匹配動作ACCEPT表示匹配該級別時(shí)記錄DENY表示不匹配時(shí)拒絕。這確保了只有ERROR級別日志進(jìn)入這個文件。SizeAndTimeBasedFNATP這個長類名是干什么的它實(shí)現(xiàn)了按時(shí)間和文件大小雙重維度滾動日志避免單個日志文件無限增大。這個配置應(yīng)該放在項(xiàng)目的哪個位置src/main/resources/logback-spring.xml是Spring Boot推薦的命名和位置使用-spring后綴可以讓Spring Boot在更早的階段加載它并支持Spring的Profile特性。如果我的項(xiàng)目是多模塊的這個配置怎么放通常放在核心模塊或啟動模塊的resources目錄下。脫離這些上下文這段代碼就是一個“黑盒”。下次你需要一個按級別、按時(shí)間滾動但只記錄WARN以上級別的日志時(shí)你可能不知道如何修改這個“黑盒”。2.3 誤區(qū)三工具驅(qū)動而非思維驅(qū)動現(xiàn)在有很多優(yōu)秀的“技能”或“智能體”平臺如OpenCode、Claude Code、Cursor的Agent模式以及各種所謂的“Superpower Skills”。它們允許你保存提示詞Prompt、代碼片段甚至工作流。這很棒但危險(xiǎn)在于我們?nèi)菀壮撩杂趯ふ液褪占白顝?qiáng)技能包”幻想有一個萬能鑰匙。比如到處搜索“Spring Boot最佳skills”、“Logback終極配置skill”然后一鍵導(dǎo)入。這種做法的問題在于你積累的是“別人的解決方案”而不是“自己的解題思路”。你沒有經(jīng)歷定義問題、拆解問題、嘗試解決、驗(yàn)證結(jié)果的全過程。當(dāng)問題稍有變體例如從Logback換成Log4j2或者需要在Kubernetes環(huán)境下配置日志采集這些現(xiàn)成的“技能包”很可能失效而你因?yàn)槿狈Φ讓永斫鈺譄o策。真正的技能是那個能讓你從零開始為Log4j2也寫出一份合理配置的元能力。工具Skills應(yīng)該是這種元能力的加速器和擴(kuò)展包而不是替代品。3. 構(gòu)建有效技能庫從一次AI對話到結(jié)構(gòu)化知識那么如何將一次成功的AI求助轉(zhuǎn)化為一個真正有用的“技能”呢這個過程可以拆解為四個步驟復(fù)盤、抽象、歸檔、驗(yàn)證。3.1 第一步深度復(fù)盤與上下文還原解決問題后不要立刻關(guān)閉對話窗口?;?0分鐘時(shí)間對這次交互進(jìn)行一次“復(fù)盤”回顧原始問題我最開始問的是什么例如“Spring Boot項(xiàng)目如何將ERROR級別日志單獨(dú)輸出到一個文件并按日期滾動”評估AI的回答它給出的方案核心是什么引入base.xml、使用LevelFilter、配置TimeBasedRollingPolicy。這個方案解決了我的核心需求嗎有沒有過度設(shè)計(jì)或遺漏追溯我的思考在AI給出答案前我自己嘗試了什么為什么失敗了比如我可能嘗試了直接在application.yml里配置發(fā)現(xiàn)不支持復(fù)雜的過濾器或者我搜了過時(shí)的博客配置不生效。這個“失敗路徑”和“成功路徑”的對比是極其寶貴的經(jīng)驗(yàn)。標(biāo)記關(guān)鍵洞察在對話中AI是否解釋了一些我原本不知道但很重要的概念例如“在Spring Boot中推薦使用logback-spring.xml而非logback.xml以利用Spring的Profile特性”“SizeAndTimeBasedFNATP已被標(biāo)記為棄用建議使用SizeAndTimeBasedRollingPolicy”。把這些復(fù)盤內(nèi)容用你自己的話記錄下來。這就是你這個“技能”的“研發(fā)文檔”。3.2 第二步抽象與模式提取這是將具體案例升華為通用技能的關(guān)鍵。不要只記錄Logback的配置要思考它背后的模式。問題模式“日志的分級與分流處理”。場景適用于任何需要將不同級別ERROR, WARN, INFO或不同來源特定包、特定用戶的日志輸出到不同目的地文件、數(shù)據(jù)庫、消息隊(duì)列的場景。核心技術(shù)組件過濾器FilterLevelFilter,ThresholdFilter,EvaluatorFilter。用于決定哪些日志事件可以通過。追加器AppenderRollingFileAppender,SocketAppender,KafkaAppender。用于定義日志的輸出目的地和策略。滾動策略RollingPolicyTimeBasedRollingPolicy,SizeAndTimeBasedRollingPolicy。用于管理日志文件的歸檔、清理和滾動。配置范式1. 繼承或引入基礎(chǔ)配置如Spring Boot的base.xml。 2. 定義環(huán)境變量或?qū)傩匀鏛OG_PATH。 3. 配置一個或多個Appender每個Appender包含 - 輸出目標(biāo)file, remoteHost等 - 過濾器決定寫入哪些日志 - 編碼器決定日志格式 - 滾動策略決定文件如何切分和保留 4. 將Appender關(guān)聯(lián)到Logger或Root Logger。常見變體與參數(shù)需求變體配置關(guān)鍵調(diào)整點(diǎn)按包名分離日志為特定logger namecom.example.mypackage配置獨(dú)立的appender-ref同時(shí)輸出到文件和控制臺定義兩個appender并在root中同時(shí)引用日志格式包含MDC信息在encoder的pattern中加入%X{userId}等限制日志文件總大小在rollingPolicy中設(shè)置totalSizeCap經(jīng)過這樣的抽象你得到的就不再是一個“Logback ERROR日志配置”而是一個“日志分級分流解決方案框架”。下次即使換用Log4j2你也能快速映射Log4j2的RollingFileAppender對應(yīng)什么LevelRangeFilter怎么用Policies如何設(shè)置。這才是可遷移的技能。3.3 第三步結(jié)構(gòu)化歸檔與工具選擇現(xiàn)在將復(fù)盤記錄和抽象模式以一種易于檢索和更新的方式保存起來。你可以選擇任何你喜歡的工具但結(jié)構(gòu)比工具更重要。推薦的結(jié)構(gòu)化記錄模板# 技能Spring Boot 日志分級與滾動歸檔配置 ## 1. 問題描述 * 核心需求將ERROR級別日志獨(dú)立輸出到文件并按天滾動防止單個文件過大。 * 典型場景生產(chǎn)環(huán)境錯誤監(jiān)控、日志審計(jì)、故障排查。 ## 2. 解決方案Logback實(shí)現(xiàn) * **核心思路**利用LevelFilter過濾ERROR級別日志使用RollingFileAppender配合時(shí)間和大小滾動策略。 * **配置文件**src/main/resources/logback-spring.xml * **完整配置代碼**此處粘貼優(yōu)化后的代碼并添加關(guān)鍵注釋 * **關(guān)鍵依賴**Spring Boot Starter Logging通常已包含。 ## 3. 原理解析與關(guān)鍵配置項(xiàng) * include resource.../為什么用它來繼承默認(rèn)配置 * LevelFilterONMATCH和ONMISMATCH的行為詳解。 * TimeBasedRollingPolicy 與 SizeAndTimeBasedRollingPolicy區(qū)別與選用場景。 * maxHistory 和 maxFileSize如何根據(jù)磁盤空間和保留周期合理設(shè)置。 ## 4. 常見問題與排查踩坑記錄 * **坑1**配置不生效。檢查文件是否命名為logback-spring.xml并放在正確位置檢查是否有其他配置文件沖突。 * **坑2**日志文件未按預(yù)期滾動。檢查fileNamePattern中的日期格式%d是否與滾動周期匹配按天滾動用%d{yyyy-MM-dd}。 * **坑3**生成了很多%i.log文件。這是大小滾動觸發(fā)的調(diào)整maxFileSize參數(shù)。 * **坑4**在Spring Boot 3.x下某些舊屬性已棄用。需參考對應(yīng)版本的官方文檔。 ## 5. 擴(kuò)展與變體 * 如何為WARN級別也創(chuàng)建獨(dú)立文件 * 如何將日志同時(shí)輸出到ELKElasticsearch * Log4j2的等效配置思路提供核心組件映射關(guān)系。 ## 6. 相關(guān)資源 * [Logback官方手冊]() * [Spring Boot Logging特性文檔]() * **本次AI對話的關(guān)鍵摘要**附上對話鏈接或核心問答截圖關(guān)于工具的選擇通用筆記軟件Notion/Obsidian等適合構(gòu)建個人知識庫通過雙向鏈接將本技能與“Spring Boot”、“日志框架”、“問題排查”等相關(guān)主題關(guān)聯(lián)起來形成知識網(wǎng)絡(luò)。代碼片段管理器可以將優(yōu)化后的、帶注釋的配置代碼保存為片段并打上spring-boot,logback,logging,error-file等標(biāo)簽。AI助手內(nèi)置Skills功能像OpenCode、Claude Code等工具允許創(chuàng)建自定義技能。關(guān)鍵不在于保存代碼而在于保存那個能精準(zhǔn)描述問題、引導(dǎo)AI給出最佳答案的“提示詞Prompt”。例如你可以創(chuàng)建一個名為“配置Spring Boot日志分級滾動”的技能其內(nèi)容是一段精心設(shè)計(jì)的Prompt“請以Spring Boot最佳實(shí)踐為指導(dǎo)為一個Web項(xiàng)目配置Logback要求將ERROR級別日志單獨(dú)輸出到./logs/error.log文件需要按天滾動并且每個日志文件最大100MB保留最近30天。請?zhí)峁┩暾膌ogback-spring.xml配置并對關(guān)鍵配置項(xiàng)添加注釋說明其作用?!?.4 第四步主動驗(yàn)證與迭代更新技能入庫不是終點(diǎn)。你需要創(chuàng)造機(jī)會去“調(diào)用”它。主動驗(yàn)證在一個新的Demo項(xiàng)目或現(xiàn)有項(xiàng)目的非核心分支中故意“忘記”這個技能然后嘗試從頭配置??纯醋约耗芊癫灰蕾嘇I僅憑技能庫的記錄完成。過程中遇到的任何卡點(diǎn)都是對技能記錄的補(bǔ)充點(diǎn)。周期性回顧每隔一段時(shí)間比如每季度回顧你的技能庫。隨著Spring Boot版本升級Logback是否有新特性或廢棄項(xiàng)你之前記錄的“坑”是否還有效根據(jù)官方文檔和新的實(shí)踐更新你的技能記錄。場景擴(kuò)展當(dāng)你在工作中遇到“將操作審計(jì)日志存入數(shù)據(jù)庫”的需求時(shí)可以回到這個“日志分流”技能看看其模式定義Appender、配置Filter是否可以復(fù)用。將新的經(jīng)驗(yàn)作為“擴(kuò)展與變體”補(bǔ)充進(jìn)來。通過“復(fù)盤-抽象-歸檔-驗(yàn)證”的循環(huán)你就能確保放入“技能庫”的不是一塊僵化的“代碼化石”而是一個活的、可生長的“知識有機(jī)體”。4. 高階應(yīng)用將技能轉(zhuǎn)化為可復(fù)用的AI智能體Agent對于更復(fù)雜的、涉及多步驟的工作流我們可以更進(jìn)一步不滿足于保存靜態(tài)的代碼或提示詞而是嘗試構(gòu)建一個微型的、可執(zhí)行的“智能體”Agent。這聽起來很高大上但其實(shí)用現(xiàn)有的工具可以很簡單地實(shí)現(xiàn)其核心思想。以“為一個新的Spring Boot項(xiàng)目快速搭建基礎(chǔ)框架”為例這遠(yuǎn)不止一個日志配置可能包括統(tǒng)一響應(yīng)封裝、全局異常處理、Swagger/knife4j接口文檔集成、MyBatis-Plus配置、數(shù)據(jù)庫連接池調(diào)優(yōu)、緩存配置等。這是一個典型的“組合技能”場景。低階做法創(chuàng)建一個文檔羅列以上每個子項(xiàng)的配置代碼和步驟。高階做法智能體思路利用AI助手的“自定義指令”、“角色預(yù)設(shè)”或“工作流”功能創(chuàng)建一個名為“Spring Boot項(xiàng)目初始化助手”的智能體。這個智能體的“大腦”可以這樣設(shè)計(jì)以一段高級Prompt的形式體現(xiàn)你是一個經(jīng)驗(yàn)豐富的Spring Boot架構(gòu)師擅長快速搭建穩(wěn)健、可維護(hù)的企業(yè)級項(xiàng)目基礎(chǔ)框架。請遵循以下原則和步驟為用戶提供幫助 1. **需求澄清**首先詢問用戶的項(xiàng)目基本信息包括 * Spring Boot版本如 3.2.x * 主要功能Web API、數(shù)據(jù)批處理等 * 需要集成的核心組件如 MySQL, Redis, MyBatis-Plus, Knife4j等 * 是否有特殊約定如特定的包結(jié)構(gòu)、命名規(guī)范 2. **按模塊提供代碼與解釋**根據(jù)用戶需求按以下順序提供**最小化但完整的**配置和代碼并為每個部分說明**為什么這么做**以及**關(guān)鍵參數(shù)的含義** a. **依賴管理**提供pom.xml中相關(guān)依賴的dependency片段說明每個依賴的作用。 b. **應(yīng)用配置**提供application.yml的基礎(chǔ)結(jié)構(gòu)包括服務(wù)器端口、激活的Profile、數(shù)據(jù)源基本配置。 c. **統(tǒng)一響應(yīng)體**提供ResultT類代碼說明成功/失敗狀態(tài)碼的設(shè)計(jì)思路。 d. **全局異常處理**提供ControllerAdvice類代碼處理業(yè)務(wù)異常、參數(shù)校驗(yàn)異常、系統(tǒng)異常等并說明異常如何映射到統(tǒng)一響應(yīng)體。 e. **日志配置**提供logback-spring.xml基礎(chǔ)配置實(shí)現(xiàn)分級、分文件、滾動歸檔。 f. **API文檔**提供Knife4j配置說明如何安全地開啟與關(guān)閉區(qū)分環(huán)境。 g. **數(shù)據(jù)訪問層**提供MyBatis-Plus配置類說明分頁插件、樂觀鎖插件等的基礎(chǔ)配置。 h. **工具類與常量**建議一些基礎(chǔ)工具類如日期處理、字符串處理和常量類的放置位置。 3. **安全檢查與最佳實(shí)踐提示**在每個部分提供后附帶1-2條該部分最容易忽略的安全或性能坑點(diǎn)。例如 * 在數(shù)據(jù)源配置中提示設(shè)置合理的連接池參數(shù)hikari.connection-timeout, maximum-pool-size。 * 在API文檔配置中提示在生產(chǎn)環(huán)境務(wù)必關(guān)閉。 * 在日志配置中提示檢查日志路徑的寫入權(quán)限。 4. **交互與迭代**鼓勵用戶提出修改意見或就某個特定點(diǎn)進(jìn)行深入探討。當(dāng)你將這樣一段精心設(shè)計(jì)的Prompt保存為OpenCode或Claude的一個“技能”或“預(yù)設(shè)”后你就擁有了一個專屬的“Spring Boot項(xiàng)目初始化智能體”。下次需要時(shí)你只需激活這個智能體它就會引導(dǎo)你完成整個初始化對話輸出結(jié)構(gòu)清晰、注釋完整、包含最佳實(shí)踐的代碼片段和配置。這就是將孤立技能系統(tǒng)性重建為可交互、可引導(dǎo)、具備一定決策能力的高階知識資產(chǎn)。你踩過的所有坑、總結(jié)的所有最佳實(shí)踐都固化在了這個智能體的“行為模式”里。5. 避坑指南技能建設(shè)中的反模式在建設(shè)個人技能體系的過程中有些做法看似高效實(shí)則隱患重重。反模式1過度追求自動化與一鍵生成試圖創(chuàng)建一個“萬能技能”輸入項(xiàng)目類型就吐出全部代碼。這往往導(dǎo)致生成的代碼過于泛化缺乏項(xiàng)目特異性反而需要花更多時(shí)間去修改和調(diào)試。技能應(yīng)該提供的是“模塊”和“模式”而不是“整站模板”。記住AI和技能是增強(qiáng)你的判斷力和效率而不是取代你的思考和設(shè)計(jì)。反模式2忽視底層原理盲目信任技能即使你擁有了一個完美的“Logback配置技能”當(dāng)遇到一個極其古怪的日志丟失問題時(shí)你依然需要理解Logback的初始化順序、Spring Boot的日志初始化生命周期甚至JVM類加載機(jī)制。技能是地圖和指南針但你自己必須懂得如何看地形、辨方向。當(dāng)技能輸出的結(jié)果不符合預(yù)期時(shí)底層原理知識是你進(jìn)行調(diào)試和修正的最終依據(jù)。反模式3不維護(hù)、不更新技術(shù)棧在迭代Spring Boot從2.x到3.x很多配置和行為發(fā)生了變化。如果你技能庫里記錄的還是基于Spring Boot 1.x的“解決方案”那它就是一個“過時(shí)地雷”。設(shè)定一個提醒定期比如伴隨主要依賴的升級回顧和測試你的核心技能是否依然有效。反模式4封閉建設(shè)不與團(tuán)隊(duì)共享個人的技能庫再強(qiáng)大影響力也有限。考慮在團(tuán)隊(duì)內(nèi)部通過共享代碼片段庫、團(tuán)隊(duì)Wiki、或定制化的團(tuán)隊(duì)AI助手預(yù)設(shè)來共建共享技能庫。每個人遇到的坑和總結(jié)的方案都能沉淀下來新人 onboarding 的效率會大幅提升團(tuán)隊(duì)的技術(shù)棧和代碼風(fēng)格也更容易統(tǒng)一。當(dāng)然共享的前提是嚴(yán)格的審核和持續(xù)的維護(hù)避免垃圾信息泛濫。從解決一個具體的“眼前坑”到有意識地將解決方案“寫進(jìn)skills”是一次從被動應(yīng)對到主動建設(shè)的思維轉(zhuǎn)變。而決定這次轉(zhuǎn)變是“重建”還是“踩坑”的關(guān)鍵在于你是否遵循了有效的方法深度復(fù)盤以理解上下文抽象歸納以提取模式結(jié)構(gòu)化歸檔以便于檢索主動驗(yàn)證以實(shí)現(xiàn)迭代。AI是我們這個時(shí)代最強(qiáng)大的杠桿。但杠桿本身不會創(chuàng)造價(jià)值價(jià)值來源于使用杠桿的人所指向的方向和施加的力。把你的每一次與AI的協(xié)作都當(dāng)作一次對自己知識體系的“壓力測試”和“升級補(bǔ)丁”。最終你構(gòu)建的將不是一個冰冷的代碼倉庫而是一個與AI協(xié)同進(jìn)化、能持續(xù)為你和你的團(tuán)隊(duì)賦能的熱乎乎的“第二大腦”。這個過程里最大的收獲可能不是那些保存下來的代碼片段而是在這個“復(fù)盤-抽象-實(shí)踐”的循環(huán)中被不斷錘煉和強(qiáng)化的、屬于你自己的問題解決框架與工程思維。這才是無論技術(shù)如何變遷都不會貶值的核心技能。