如何提高效率

開發人員和寫作人的提高效率技巧和技巧 我在我的電子郵件收件箱中經常收到一個重複的問題。 問題是,你是怎麼那麼高效率的呢? 一開始,這個問題真的很奇怪,因為我自己並不認為自己是一個高效率的人。 但是回想一下,在過去的9個月裡,我創作了6本免費的技術電子書,每天發布一篇博客文章(已經進行了400多天),還創建了4個線上課程。除此之外,我每天接收大約80封私人郵件(指非批量郵件),並試圖回復每一封-但未達到成功。看起來像是相當高的生產力。 有段時間,我的回答是我有很好地組織自己的時間,或者只是專注於工作。 我越想越多,內心越感覺到,我對工作的思考方式可能對每個人都有所幫助。 也許有一些特定的可行的建議,你可以應用到你的工作中。 學會說「不」 設定一個大目標。可以是寫一本小說,建立一個應用程序,開始一個博客,或是在你的服務型企業中實現首次銷售。可以是任何事情。 一旦你設定了目標,向後退一步,思考一下所有與這個目標相悖的活動。 你的日常工作。 和朋友的夜晚外出。 足球隊的比賽。 你的家人。 周末旅行。 會議。 電子遊戲。 向你索取時間的人。 任何涉及你親自出席的身體或思想的活動。 對於那份清單上的所有事情,當然你不可能全部說「不」。我也不這麼做。 然而,我對我所說「是」的事情非常,非常挑剔。 我說「不」去參加會議。 我說「不」去拿走我目標的時間的商業機會。 我說「不」去為每個人個別指導,儘管每天都有人請求我這麼做。 消除干擾 電視。 Netflix。 YouTube。 Instagram。 Facebook。 Reddit。 Hacker News。 Whatsapp或Telegram群組。 遊戲。 郵件。 新聞。 我們每個小時都在被各種干擾轟炸著。同樣作為一個物種,我們對通知有著全球性的成瘾。一旦有任何一段「空閒」的時間,我們都會掏出手機,檢查Facebook、Instagram、電子郵件,看是否有需要我們關注的新事物。我每天都在這樣的情況下陷入困境,尤其是與電子郵件相關的情況,但我一直在試圖改善。 當然,首要的事情是停用所有通知。來自手機、電腦或任何設備的任何通知都要禁用。不要給這些設備任何吸引你注意力的機會。我們是這些設備的奴隸。好吧,不是設備-而是那些將我們的注意力納入設計中的公司。他們竭盡全力運用每一種心理策略,以便讓你上癮於他們的產品,以便他們能夠賣更多廣告,為他們的投資者獲得更多利潤。一旦你意識到這一點,你可能會在進入地鐵或乘坐公共汽車,看到每個人都在看手機時,改變一下想法。 我住在一個相當偏遠的地方,當我去附近的大城市時,我對眼前到處都是人在看手機印象深刻。 其次,早上別檢查手機。避免看新聞。新聞就是為了讓我們擔心的。如果出現一些重大的、令人震驚的新聞,你會聽到的。 信息飲食(我第一次在《每週工作4小時》一書中讀到這個詞)是我真的建議任何人去做的。 我只在下午打開我的郵件,這給了我一個很棒的機會,讓整個上午都專注於工作。這大約是4到5個小時,取決於當天的情況。我不會建議早起更多的時間,以獲得更多的時間,因為我發現如果睡眠時間不夠,我無法正常地工作,所以我只在感覺到需要的時候起床(這也是在家工作的好處之一)。 追踪您的時間並使用阻擋軟件 給自己一點好處,使用追踪應用程序。iPhone和iPad現在內置了這個功能。桌面上的RescueTime也很不錯。它每天都會給出一個很好的想法,即你浪費了多少時間。 使用阻擋軟件。我使用Block Site。非常好用。我還使用SelfControl,這款軟件更強大,因為計時器倒計時結束之前你無法禁用它。 不浪費精力 所有這些追蹤和阻擋應該可以省下更多的時間,因為你不再浪費時間。 你不再浪費時間和精力。精力是讓你做出最好工作的因素,如果你消耗精力去看Instagram,思考著其他人的生活,你將會消耗很長時間,因為你永遠也不會為自己取得任何成就。 對提高產能說「是」 提高產能有多種不同的層次。避免那些看起來似乎很產能的事情。例如,電子郵件就是其中之一。像Slack這樣的工作聊天室也是如此。 花幾個小時在Hacker News上顯然似乎很有產能。你一直在跟上行業。或者你只是在爭論並試圖贏得一場辯論呢? 我目前有兩個主要目標。我每天都在Momentum中寫下主要目標,這是一個在我在瀏覽器中打開新標籤時顯示的儀表板。每天早上我都在其中刷新我的思維。我還將其打印在2張A4紙上,貼在電腦後面的牆上。以及我的白板上。逃不掉了。 安排好你的一天 我使用的一個把戲法是,事先知道明天我要做什麼。我們都知道這個故事:如果你將你的跑鞋準備在床邊,那麼你早上跑步的機會就更大。如果你得先找到你的裝備,機會就是你會睡過頭。同樣的原理也適用於我的工作。計算機已經準備好,整理得很好,我已經知道該做什麼了,因為我在白板上寫下來了,沒什麼問題。 首先,要從最重要的工作開始。 我以前習慣先做一些輕鬆的任務,但現在我轉而去面對最重要的事情。 這樣可以讓我在一天開始時付出最好的精力和注意力。我把不那麼重要的任務留給下午,因為體力不如剛吃飽的時候那麼旺盛。我沒有按小時進行時間安排。每天對我來說都是不同的,但是至少知道我將如何開始很重要。 花時間外出 對於我們這些程序員來說,這點非常非常重要。我們坐在辦公桌前數小時。 我經常休假半天去大自然中漫步。我非常推薦你也這樣做。 這並不是浪費時間,從提高效率的角度來看:通過播客和Audible,這是學習的完美時機,同時從植物中獲取能量,只需散步(或騎自行車,或其他方式)。但是,只是休息一下對你來說會帶來奇跡-每次我出去散步,回來後,我對自己需要做的工作更清楚了。作為一名程序員,我一直在解決問題。思想的美妙之處在於,它可以在我們完全無意識的狀態下工作,即使我們沒有思考,它也可以解決問題。它只需要時間,當你不再專注於那個問題時,最好的解決方案就會出現。你是否曾經在洗澡時思考出一個極妙的點子?點子不是在你工作時出現的。它們是在你做其他事情時出現的。我還喜歡在走來走去時錄音筆記。然後過一段時間後再聽一下,這些筆記的90%都是糟糕的點子。剩下的10%是好的點子。 保持一致 一致性是一個非常強大的心理觸發器。一旦我們開始做某件事情,並且我們做了一個有意識的決定要繼續做下去-例如每天寫1000個字,那麼在我們內部會有一個系統,會給我們施加一些壓力,讓我們保持一貫。 想象一下,過去30天裡,你每天都寫1000個詞。在某個時刻,你成為了每天寫1000個詞的人。你只是這麼做而已。毫不費力。 這就是我連續寫了400多篇博客的方法,每天一篇。我是每天寫一篇博客的人。這不需要做出任何決定,這就是事情的進行方式。 一個非常重要的事情是不要斷鏈。...

如何替換 DOM 元素

當我們有一個 DOM 元素時,我們該如何用另一個元素來替換它呢? 假設我們有一個 DOM 元素並且已經有了對它的引用(可能是使用 querySelector() 獲取的)。 要將其替換為另一個 DOM 元素,可以在第一個元素上調用 replaceWith() 方法,並將第二個元素作為參數傳遞: const el1 = document.querySelector(/\* ... \*/) const el2 = document.querySelector(/\* ... \*/) el1.replaceWith(el2) 由於 Edge < 17 和 IE11 不支援此方法,如果你計劃支援這些瀏覽器,則應使用 Babel 將其轉換為 ES5。 另一種解決方案是查找父元素並使用 replaceChild() 方法,該方法更早並且被所有瀏覽器支援: const el1 = document.querySelector(/\* ... \*/) const el2 = document.querySelector(/\* ... \*/) el1.parentNode.replaceChild(el2, el1)

如何開始一個部落格的第一步

第一步總是最難的,不論你想做什麼事情,跑步、編碼、煮飯還是寫部落格。 在這一章中,我想確保你準備好了跳入部落格的第一步。 選擇域名 在創建部落格之前,有一件非常重要的事情你需要做,那就是選擇一個域名。 你可以注意到關於域名有三種模式。人們使用自己的名字和姓氏組合,就像我使用flaviocopes.com一樣。有些人喜歡使用幻想名字或者他們的綽號,這也是完全可以的。 如果這個名字很酷,你可以將其打造成一個品牌,這是非常棒的。比如codinghorror.com。還有一些人喜歡使用更一般化的品牌,比如css-tricks.com。 這種方式的好處是人們一眼就能知道部落格的內容。缺點是你在某種程度上被迫永遠只談論這個主題。 舉個例子,css-tricks.com早就不僅僅討論CSS,而且經常涉及其他主題,如JavaScript、SVG等。 這是一個有爭議的問題,但我認為使用自己的名字或者沒有直接關聯到具體內容的品牌名稱是創建域名的最佳和最具有未來保護性的方式。 當然有一個例外,比如raywenderlich.com。 如果你創建一個特定的域名,讓人們會立刻聯想到某個特定的技術或愛好,其中的好處是在它取得成功後,你可以將它賣給一個更大的品牌。 我最初在我的部落格上頻繁發布關於Go編程語言的內容。後來我完全轉向了另一種完全不同的編程語言- JavaScript。 但因為我使用了自己的名字和域名,我不需要做任何更改。如果我的域名是startprogrammingingo.com或類似的名字,我絕對無法轉向談論JavaScript或Arduino。 整個專案就會崩潰,因為我停止了對Go的工作,這個具有非常特定域名的網站也將結束它的生命。 由於我使用了自己的名字作為域名,無論我未來10年還是20年想寫什麼,都沒有任何問題。 如果你已經有一個域名,在舊專案中使用過,並且你認為它可以運行良好,那就更好了。 域名權威度 有一個非常重要的因素叫做域名權威度。這是Google用來評估你的網站價值的方式,也是Google在搜索結果中排名網頁的基礎。 域名的年齡是域名權威度的一個因素。域名越老,對Google來說越穩定、越可信。 還有在創建域名時,盡量獲取最長的到期日期。這也是一個因素。Google基本上是通過這個來判斷你對這個專案的認真程度。如果你的域名在3年後到期,而競爭對手的域名在3天後到期,也許你的域名在長期來看更好。 我的意思是,我們無法真正知道Google的算法是如何工作的,但我們可以嘗試確保我們滿足所有條件。 這可能會影響到一個網站是否受到訪問,它可能每天只有10個訪問者,也可能每天有幾百或幾千個訪問者。 選擇一個部落格軟件(不要自己建立) 我個人使用Hugo來為我的部落格提供動力。它是使用Go編寫的,速度非常快,並且對於你可以做的事情有一些限制。這意味著我可以避免分心,專注於寫作。 我看到很多人,尤其是開發人員,開始從頭開始創建自己的部落格軟件。 我認為這是一個壞主意。 為什麼呢? 因為你開始的時候是你有最多精力的時候。在你的部落格的生命周期中,不會再有另一個時刻讓你對它充滿熱情和動力。 如果你把這股能量轉向一些完全無用的事情,比如建立軟件,這樣寫內容的時間會非常少,精力也會很少,創作出優秀的內容的動力也會很少。 另外,你還要自己解決軟件上的問題、處理更新等等。讓其他人來維護被數千人使用的流行軟件比重新發明輪子簡單得多。 選擇一個極簡主題 我認為第二個錯誤是在設計之前就先設計外觀。 與開發人員喜歡建立自己的軟件一樣,設計導向的人也想創建自己的設計。這是合情合理的,我明白。但在這種情況下,在開始階段,這只是一個干擾。 我的建議是:選擇一個庫存主題,找到最簡單的那個。 主題越簡約,越好。 記住將焦點放在內容上,而不是部落格引擎、主題或插件上。 我有幾個使用默認Ghost主題構建的部落格,看起來非常專業。在它們所在的領域,沒有人知道Ghost是什麼,更不用說他們知道這是默認主題。 而且,說實話,沒有人在乎這些。除了你自己。 你可以稍後再做設計工作。永遠有時間去做這些。 創建前三個帖子 在確定了部落格的想法後,寫下前三篇帖子。你可以在普通純文本編輯器中寫下它們,然後再將它們移動到你選擇的部落格平台上。 我喜歡使用Bear (https://bear.app)來創建我的草稿。它會自動保存,使用起來美觀且直觀。但這並不重要。我希望你專注於這三篇帖子。 為什麼恰好是三篇帖子? 因為現在你如此激動地創建部落格,寫下三篇優秀的帖子是最容易的事情了。如果你只創建了一篇帖子,也許第二篇帖子會拖到明天,然後是後天…然後你只有一篇帖子的部落格。 兩篇帖子…差不多一樣。對我來說,三篇帖子看起來是一個好數量。 完成這三篇帖子後,是時候發布它們了。我的建議是,不要一次性全部發布,而是應該預先安排它們。 預先安排前三篇帖子 有很多人問我怎麼能夠如此一致地寫部落格。我最好的建議是培養一個習慣。這些天培養習慣是一個非常時髦和受歡迎的話題,出版了許多關於這個主題的書籍。 我不是專家,但我注意到一旦建立了一個習慣,真的很難打破。 使用這個小技巧來迫使自己寫部落格帖子。一旦你確定了你的完美計劃(每週兩次、每週一次、每兩週兩次、每月一次…),然後預先安排你寫的三篇帖子,以便你能夠創建一個小緩衝區。 假設你每周寫一次。立即發布第一篇帖子,下週發布第二篇,第三周發布第三篇。 現在,你可以放鬆一下,來場小派對,因為你可以上線了。此外,你已經創建了未來兩週的內容,你可以開始計劃其他帖子。 你之後寫的所有帖子都會依次排在最初創建的帖子之後。 不要在計劃的時間表中加入新的帖子的誘惑:有時你會由於時間有限無法寫作,或者你會有一個精力不足的一周。緩衝區將有助於保持一個一致的發布時間表。 在這裡關鍵的一點是:一旦時間表足夠充裕,你可以回顧一下您長時間發布的各種帖子,它們非常一致地保持在發布日期上,你就會開始感到一點壓力,不希望打破這個串。 將這點小壓力轉化為保持一致的積極“推動”。如果你有每週發布的習慣,那麼在一年結束時,你將寫了52篇部落格帖子,這將是一個重大的成就。 堅持下去 如果你按照我在本章中提到的方法去做,並且繼續堅持下去,你在部落格方面的成功將比任何其他人多99%。

如何準備軟體工程師的面試

在獲得工作機會之前,你很可能要經歷一個叫做面試的過程。 面試過程 當你通過公司的網站直接申請、通過招聘人員或工作廣告申請時,公司會根據你的履歷和求職信來判斷你是否適合。 如果你在龐大的應聘堆中脫穎而出,你將開始所謂的面試過程。 在面試過程中,你需要展示自己的能力,以便公司能夠正確評估你的技能水平,確定你是否適合該職位並提供適當的薪酬。 技術面試有多難?這很大程度上取決於公司的類型。 FAANG面試過程 FAANG指的是Facebook、Apple、Amazon、Netflix和Google,這是一個標誌著大型科技公司的方式。 大型科技公司非常嚴格,你不能只是申請然後希望不錯。那些獲得錄用的候選人在申請之前會為面試做長達數月的準備。有些書籍和課程專門用於準備這些面試。 原因是,準備面試需要與學習編程完全不同的準備。我對為什麼會這樣並沒有明確的解釋,並希望這種情況在未來能夠改變。但基本上我的理解是,面試官希望你通過這個過程來確保你真的想在那裡工作,你非常堅定地想在那裡工作,願意花數月的時間專門為了面試做準備。然後一旦面試結束,你會從事完全不同的工作。我特別指的是計算機科學算法、數據結構等等。像HackerRank和LeetCode之類的網站是你可以準備技術面試問題的地方。 依我之見(只是我個人觀點),應該有一種不同的方法來評估你的技能,但目前產業的現狀就是這樣。 當他們問你這些技術問題時,他們會分析你解決問題的能力,討論你的解決方案,並試圖看你如何處理在更改需求時的問題。 Google面試過程 例如,Google通常有一個4至9個步驟的面試過程。 首先,你會通過電話與招聘人員進行篩選,他們會分析你的履歷並回答一些基本的編碼問題。之後可能會有另一次電話面試。 如果你通過了上述過程,就會被邀請到公司進行4或5次每次45分鐘的面試。這些面試將是在白板上進行的技術面試。如果被選中,你將獲得一份工作邀請。 這個過程非常嚴格,因為每年都有大量人申請Google,而他們只能聘用最優秀的人才。 小型公司的面試過程 小型公司的面試過程較短,具體的面試流程通常也會更短。 如果你很幸運,面試可能會很快。這可能發生在你已經認識將要雇傭你的人,而且他們已經知道你合適。但在絕大多數情況下,你都會經歷一個面試過程。 他們可能會問你一些傳統的計算機科學算法和數據結構問題,因為他們像大公司一樣進行面試。 他們也可能會有不同的流程,例如在面試之前可能會給你一些家庭作業,面試時你將討論家庭作業,而不是被要求實現一個隨機算法。 軟技能的評估 每一次面試都是為了評估你和你的技能。他們將評估你的技術技能,但也會評估你的軟技能,如溝通、協作以及作為團隊成員的表現能力。

如何禁用 ESLint 規則

一篇關於如何禁用 ESLint 規則的快速教程 您的工具可能會自動設置no-debugger和no-console規則,但您可以做些什麼來禁用它們呢? 在開發模式中,瀏覽器調試工具和Console API的訪問是必不可少的,雖然在生產代碼中可能有正當的理由禁用它們。 您可以通過添加如下幾行代碼來禁用一個或多個特定的ESLint規則: /* eslint-disable no-debugger, no-console */ console.log('test') 或者您可以在一個區塊中禁用它,在之後重新啟用: /* eslint-disable no-debugger, no-console */ console.log('test') /* eslint-enable no-alert, no-console */ 或者您可以在特定的行中禁用該規則: console.log('test') // eslint-disable-line no-console debugger // eslint-disable-line no-debugger alert('test') // eslint-disable-line no-alert 另一種方法是在項目全局禁用該規則。 在package.json中,您可以找到eslintConfig規則,裡面可能已經有一些內容,像這樣: "eslintConfig": { "extends": [ "react-app", "react-app/jest" ] }, 在這裡,您可以禁用您想禁用的規則: "eslintConfig": { "extends": [ "react-app", "react-app/jest" ], "rules": { "no-unused-vars": "off" } },

如何解决 ES 模块范围內的“__dirname 未定义”的錯誤

下面是如何解决“__dirname 未定义在 ES 模块范围內”的錯誤的方法。 在使用 ES 模块時,无法使用 __dirname。 在 Node 脚本中,可以使用 __dirname 获取 当前 JavaScript 文件所在文件夹的路径,许多 Node.js 项目中都会使用它。 但是,如果在 ES 模块中使用它,你将遇到“__dirname 在 ES 模块范围內未定义”的錯誤。 在这种情况下,你可以做什么呢? 我通过使用在 Node.js GitHub 问题页面中找到的解决方案来解决此问题。 首先,你需要导入 Node.js 的 path 模块 和 url 模块中的 fileURLToPath 函数: import path from 'path'; import { fileURLToPath } from 'url'; 然后,你可以按照以下方式复制 __dirname 的功能: const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); 顺便一提,这也复制了 __filename,它返回正在执行的代码的文件名。 现在,你可以像往常一样使用 __dirname: console.log(__dirname)

如何解决“TypeError: Attempted to assign to readonly property”错误

在我的 Next.js 代码库中,我遇到了这个问题: TypeError: Attempted to assign to readonly property 奇怪!经过一番调试,我找到了问题所在。它与 Next.js 无关,它可以发生在任何 JavaScript 代码库中。 在我的数据库中,有一列是以 JSON 的形式存储数据。 在我的代码中,我使用点语法(例如 data.name = 'Flavio')来更新这个 JSON 对象,但是我忘记在此之前调用 JSON.parse()。 data 不是一个对象,而是一个字符串! 在 JavaScript 中,字符串是不可变的。一旦定义,我们无法更新它们。因此会出现错误。解决方法很简单,就是在更新 JSON 对象之前调用 JSON.parse()。

如何解決 JavaScript 中引入模塊時出現的意外標識符錯誤

這是我在解決這個問題時的建議。 如果你在 JavaScript 應用程式中使用 import 陳述式來引入不同的文件,你可能會遇到瀏覽器顯示 意外標識符 錯誤。 為什麼會這樣?該如何讓 ES6 模塊在瀏覽器中正常工作? 你只需要做一個微小的更改:在加載你的主入口 JavaScript 文件時,使用以下方式: <script type="module" src="index.js"></script> 而非只使用: <script src="index.js"></script> 這樣應該可以解決你的問題。

如何解決 JavaScript 中的「is not a function」錯誤

我在寫 JavaScript 時不加分號。 而這個我真的很喜歡。在我看來,這樣子語言更加清晰。 你可能不喜歡這樣,這是可以理解的。但這就是事實。 分號是可選的,我們沒有必要加上它們。 然而,有時我們必須要特別注意。尤其在 Node.js 中,我們使用 require() 來載入外部模組和檔案。 這可能會導致某些情況下出現以下錯誤: TypeError: require(...) is not a function 這是一個奇怪的錯誤,對吧? 讓我們看看我是如何遇到這個錯誤的。 我載入了一個函式庫,然後我要在根層級執行一些程式碼,並且我建立了一個立即調用的異步函式: const fs = require('fs') (async () => { //... })() JS 在 require() 後面看不到分號,然後我們以 ( 開頭一行,JS 以為我們要執行一個函式。 它將 require('fs') 視為函式的名稱,如果該模組導出返回了一個函式,這實際上是可以正常工作的。 但實際上並不是這樣,所以我們得到了 ...is not a function 的錯誤。 我們該如何解決這個問題呢? 我們需要加上一個分號。隨便哪都可以。 這個方法能有效解決問題: const fs = require('fs') ;(async () => { //... })() 另外這個方法也能正常工作: const fs = require('fs'); (async () => { //... })() 這是我們必須付出的一點小代價,為了避免到處使用分號。...

如何解決 macOS 中的 xcrun invalid active developer path 錯誤

使用命令行快速解決這個煩人的問題 最近在將我 macOS 版本更新為 Catalina 後遇到了這個問題。 當我試圖通過 Homebrew 更新 Hugo 時,觸發了這個錯誤: xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 雖然命令成功完成了,但我們不想看到錯誤,是嗎? 以下是我解決這個問題的方法。 在終端中執行以下命令: xcode-select --install 這會觸發一個在 macOS 中的對話框: 點擊「安裝」並接受條款後,下載會開始: 安裝完成後: 我關閉了終端窗口並打開了一個新的終端。 問題解決。