比起35歲程序員,無知犯錯的年輕一代是否更應該被原諒?

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"程序員犯了一個無知的錯誤,應該被原諒嗎?近期,這個話題被廣泛討論。而引起這個話題的原因便是PlanetScale犯的一個“小錯誤”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"學會數據庫索引技術原理,需要花費5000美元"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"軟件工程師Brian Anglin所在的團隊計劃在Superwall開發一個SDK,其中的一項工作是需要跟蹤客戶所有的服務對象,即最終用戶。團隊預先估算了數據量:假設與5家公司合作,每家公司的日均下載量約爲5000次,那麼單日下載量就在25000次左右,單月之內用戶數量爲75萬。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Anglin所在公司使用的是便是PlanetScale的無服務器數據庫產品。他們爲用戶分配了一個隨機ID,爲了可以在明確用戶身份之前就開始進行跟蹤,Anglin團隊設置了兩個表:ApplicationUser 與 ApplicationUserAlias,其中ApplicationUserAlias 與ApplicationUser屬於多對一的關係。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"image","attrs":{"src":"https:\/\/uploader.shimo.im\/f\/U87pco6gkaTe4Iv5.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJhY2Nlc3NfcmVzb3VyY2UiLCJleHAiOjE2MzYzNTY5MzAsImciOiJSZFdDd2szZ3FLS0pKcFZnIiwiaWF0IjoxNjM2MzU2NjMwLCJ1c2VySWQiOjI0MzYwNzkwfQ.lhF4DhJK6dNAaUcDwR2cXZXrJ1vRpfwkXJj5fYxbnuw","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" 但有個問題是,PlantScale的Vitess不支持foreign key,這導致了系統無法自動創建索引。爲了查找用戶的所有別名,Anglin團隊運行了以下查詢:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/uploader.shimo.im\/f\/iMdXLUiLXOPab4sH.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJhY2Nlc3NfcmVzb3VyY2UiLCJleHAiOjE2MzYzNTY5MzAsImciOiJSZFdDd2szZ3FLS0pKcFZnIiwiaWF0IjoxNjM2MzU2NjMwLCJ1c2VySWQiOjI0MzYwNzkwfQ.lhF4DhJK6dNAaUcDwR2cXZXrJ1vRpfwkXJj5fYxbnuw","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"如果僅通過applicationUserId查找,操作成本是極低的。但是,PlanetScale的計費模式以“讀取的行”爲基礎,而Anglin將其理解爲“返回的行”,他認爲最多隻會返回100個ApplicationUserAlias行,按每讀取1000萬行收費1.5美元來算,100行的成本基本可以忽略不計。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"但實際上,PlanetScale對“讀取行”的定義是“在查詢或對您的PlanetScale數據庫進行任何類型的突變期間,檢索或檢查的行數。”這裏的關鍵詞是“檢查”。團隊查找100個別名的簡單查詢實際上是檢查了整個users表,而這個表在服務上線短短一個月內就已經超過了100萬行。這不僅使查詢速度變慢,更重要的是每一項執行此查詢的請求都會花掉0.15美元。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"“從統計數據來看,我們每小時大約會向端點發出280項請求,摺合每天1000美元左右,跟PlanetScale提供的計費結果基本匹配。”Anglin表示。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"解決辦法也不復雜,只要手動創建原本由MySQL自動創建的索引就可以了。但工作人員並沒有意識到問題,直至“天價賬單”的出現。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/uploader.shimo.im\/f\/CBCjLw7wFmqSJxfl.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJhY2Nlc3NfcmVzb3VyY2UiLCJleHAiOjE2MzYzNTY5MzAsImciOiJSZFdDd2szZ3FLS0pKcFZnIiwiaWF0IjoxNjM2MzU2NjMwLCJ1c2VySWQiOjI0MzYwNzkwfQ.lhF4DhJK6dNAaUcDwR2cXZXrJ1vRpfwkXJj5fYxbnuw","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"“無知”程序員寫出的可怕schema"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"如今,PlanetScale目前已經修正了這個問題,Anglin團隊的月度查詢成本又迴歸了較爲合理的150美元\/月水平。但這件事已經在不少論壇上引發了熱議,尤其是擴展到了對基礎能力不夠的初級程序員身上。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"“我覺得索引是一個非常基本的數據庫知識,這也應該是你該具備的常識。此外,知道 ForeignKeys 通常將索引應用於列也是我的基本認識。對你的遭遇感到抱歉,但也恭喜你學到了一課,其實你可以通過谷歌搜索 MySql ForeignKeys 獲得這些的知識,併爲自己省去這些麻煩。”有網友說道。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"程序員“rachelbythebay”也專門撰寫了一篇文章來指責一些無知的程序員。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"“這是個人人能寫文章、能表達自己觀點的時代。哪怕我們的水平再差,提出的是一套緩慢、臃腫、任何有經驗的人一看就知道完全荒謬的SQL數據庫使用方案,恐怕也會有人直接照搬,同時還慶幸自己省掉了不少麻煩事。”rachelbythebay表示。如果是那個程序員把大量原始字符串(也就是varchar)塞進schema,而且還對foreign key關係毫無概念,問題最終會惡化到何種地步?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"rachelbythebay用自己的親身經歷表明了無知會對系統造成多大的損害。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"2002年時,“rachelbythebay”所在公司爲了減緩和阻斷衆多垃圾郵件的傳播速度設計了一套系統。雖然團隊可以能拿到開放代理主機的列表,但正常發送郵件的合法組織也被莫名其妙地添加進了黑名單。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"經過排查發現,原來每行都包含有原始字符串,所以數據庫的匹配檢查負擔特別重。舊系統將IP地址、HELP字符串、FROM地址以及TO地址整合在單一表內,並在第一次收到特定元組(「四元組」)時返回4xx“臨時故障”錯誤。能夠正確執行SMTP的真實郵件服務器會在稍後重試,一般間隔是15分鐘到1個小時之間。如果對方確實重試而且間隔時間合理,那麼下一次就會被允許通過。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"雖然聽起來可行,但這背後還隱藏了一個很大的問題。團隊用的是純標準版MySQL,所以這份表中的各行的顯示形式如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"id | ip | helo | m_from | m_to | time | ..."}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"這些內容都是字符串(也就是數據庫中的varchar),所以這個四元組表中的每一行都如下所示:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1 | ip1 | blahblah | [email protected] | [email protected] | ..."}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2 | ip2 | foobar   | [email protected]   | [email protected] | ..."}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3 | ip3 | MAILSERV | [email protected]           | [email protected]    | ..."}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4 | ip4 | foobar   | [email protected]   | [email protected] | ..."}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"所以,整個匹配過程相當於:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"SELECT whatever FROM quads WHERE ip='ip1' AND HELO='thing_they_sent_us' AND m_from='whatever' AND m_to='some_user'"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"這個恐怖的數據庫schema一旦開始運行,就會不斷對錶中各行執行字符串比較。它需要讀取表中的各個行,再將查詢中的字符與當前行內找到的字符進行比較。雖然只要某列不匹配就會被中止,但整個過程仍然緩慢、令人頭痛。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"“當初負責設計和編程的傢伙把活兒搞砸了,而且問題一直持續了幾個月。最終我不得不翻查日誌記錄,看看系統到底是怎麼熬過那段時光的。”rachelbythebay寫道。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"rachelbythebay感嘆道,每個人都要經歷青澀的階段,迫切需要他人給予引導、說明或者參考。但這與殘酷的現實形成了鮮明的對比:一邊是剛過35歲就丟掉工作、不知道接下來該幹什麼的老鳥,另一邊則是無知無畏、什麼都敢往schema裏塞的新人……這個世界到底怎麼了?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"初級程序員應該被指責嗎?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"rachelbythebay表達了初級程序員莽撞無知的指責,但在他的帖子下邊,很多人表達了反對。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"“即使是具有 Rachel 經驗水平的人仍然不瞭解數據庫優化的所有細節,初級程序員需要被更有經驗的工程師指導,而非被一味批評。”有網友說道。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"有一句話在開發人員圈子廣爲流傳:“初級開發人員的標誌就是需要在中級和高級開發人員的指導下完成工作。”每個開發人員都是從初級到中級、再到高級的一個過程,但在很多資深開發者眼裏,高級開發人員是各項能力的綜合體現,而非僅僅寫代碼的能力。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"有開發者指出,編寫優秀軟件的挑戰不是要做到每個細節的完美,而是培養判斷力並專注在真正重要的細節上。對初級程序員的不屑一顧和傲慢會讓他們害怕犯錯,進而使他們的發展停滯不前。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"印度 IT 項目經理Ravi Shankar Rajan認爲,高級開發人員所爲人稱道的是專業性,而不是具備多少年經驗,也不是從來不犯錯。從初級程序員到高級開發人員,需要培養各種技能,單純的經驗積累也不意味着會成爲高級開發人員。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Rajan給初級程序員提出了以下三個建議:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"numberedlist","attrs":{"start":null,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"克服鄧寧 - 克魯格效應,即不要高估自己。初級程序員和高級程序員的區別在於初級程序員認爲自己什麼都懂,而高級程序員則知道自己還有很多東西要學。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"numberedlist","attrs":{"start":"2","normalizeStart":"2"},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"優秀的高級程序員清楚地知道什麼時候不應該做什麼。關鍵不在於規避風險,而在於謹慎選擇正確的戰場。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"numberedlist","attrs":{"start":"3","normalizeStart":"3"},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"抱有瘋狂的好奇心。好奇心是一種可以越用就會變得越好的工具,這也是人們對優秀高級程序員的期望。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在很多人看來,初級、高級程序員是一個年齡劃分,但實際上,更多的是對能力的劃分。“學會學習”和“尊重以前的東西”是與開發一樣重要的技能。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"相關鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/briananglin.me\/posts\/spending-5k-to-learn-how-database-indexes-work\/","title":null,"type":null},"content":[{"type":"text","text":"https:\/\/briananglin.me\/posts\/spending-5k-to-learn-how-database-indexes-work\/"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"http:\/\/rachelbythebay.com\/w\/2021\/11\/06\/sql\/","title":null,"type":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"http:\/\/rachelbythebay.com\/w\/2021\/11\/06\/sql\/"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章