如何估計編程時間

預估建立軟體所需時間的精細藝術 我真的很想告訴大家我如何估計建立軟體專案所需的時間。 在過去的十年中,我已經被問了數百次這個問題。 “我們需要實現這個功能。你需要多長時間?” “請給我一個詳細的概述,這個專案需要多長時間。一個月?兩個月?” “我希望你發布這個。50小時的計費時間夠嗎?” 對於這些問題的答案,通常最多只是一個 賭注。或者只能是 一次躍進的信任,我知道,如果我承諾一個數字,無論實際所需時間短長,這可能都會是我的薪水。 有時候對於長期客戶,我能夠用相超出估計的專案來彌補我所期望完成工作的早期專案,讓客戶知曉。 最終,我只能說 " 我無法估計"。 所以,對於 “我真的很想告訴大家我如何估計建立軟體專案所需的時間” 的答案是:我不行。 但我可以估計,沒有人真正能夠估計 建立軟體所需時間,因為這個領域內部的複雜性會對你產生影響。 “真正的工程師” 會發現這很難承認,但我從來不是你典型的真正工程師類型。 當你作為開發者工作時,估計可能是最困難的事情。 以下是一張很棒的參考表格,當你需要估計一個任務時可以使用。 任務 你的估計 你忘記的 實際所需時間 一個小的錯誤修復 2分鐘 我們需要找到在原始碼中有錯誤的函數,進行git pull,檢查我們是否破壞了其他函數,我們需要添加一些測試,執行測試,修復我們破壞的測試,部署,更新錯誤追踪器 2小時 一個小的功能 2小時 你需要修復代碼中待處理的TODO,並查看為什麼有一個 //don't touch this 註解。你需要仔細進行手動測試,加上瀏覽器測試,並檢查為什麼在Edge上的預期結果未達到預期。哦,我們還需要在文檔中更新所有截圖 10小時 改善端點的性能 10小時 你需要準確的基準測試,用於證明你的新實現方法正確運作,並添加以前不存在的10多個測試,否則你會有破壞數以萬計客戶使用的生產代碼的風險 5天 重寫整個前端代碼 3週 你開始使用你正在實驗的新的 更具可擴展性 框架,而不觸及UI,但你遇到了一整套完全新的問題,這次沒有StackOverflow或Google可以幫助,因為這個框架太新了。你遇到了獨特的問題,你需要雇用該庫的維護者來與你合作,但他已經轉向下一個偉大的事物。同時,UI團隊決定完全重寫界面,2次。在中途時間,產品經理希望將產品微調到稍微不同的產品 12個月 這可能是我們缺乏估計的很好估計,但事實上事情也可能相反:你估計需要5天的事情實際上可能只需1天,因為你發現一切都已經就緒,只需要添加它,所需時間比預期的少得多。 有些人可能會高估,預計他們可能會遇到困難,增加他們認為需要的30%。 團隊專案的估計甚至更困難,我甚至不會嘗試。 那麼該怎麼辦呢? 與其詳細估計,我建議與委托你工作的客戶、老闆或其他人進行持續溝通,每周檢查專案進度。而不是預先設定結束時間。 因為終究這個過程永遠不會結束。

如何作為開發人員開始自由職業

我在 Twitter 上收到了這個問題:「我想自由職業並為自己工作,這是我長久以來想做的事情,但我從未有勇氣或動力這樣做。對於想要走這條路的人,你能給哪些建議?你現在所知道的,你希望一開始就知道?」 這是一個很大的話題。 我認為自由職業是最大的自由。 我從未被一家公司雇用過,在一開始時(2008年)我是作為自由職業者和承包商工作,然後逐漸轉向自己的小型軟體產品業務,然後又轉回承包工作,在我自己的項目成為我的收入時逐漸停止這項工作。 如果你目前在受雇,最好的方式是詢問你的雇主是否可以以合同工的身份付薪水。或者,詢問過去的雇主,如果你有這樣的機會且與他們的關係良好。或者,詢問過去的同事。 開始的途徑之一是通過那些大型知名的市場,你可以在那裡找到自由職業者的工作職位。 這在很大程度上取決於你所在的地區,因為自由職業者的市場可能對於低成本國家來說是好的,但對於其他國家來說可能很糟糕。 這可以是一個好的選擇,也可能不是。 理想情況下,你可以通過當地活動、朋友的介紹或直接冷郵件或打電話的方式找到一家當地公司,詢問他們是否需要幫助,即使你剛開始。 公司喜歡使用承包商,因為他們可以節省很多錢,並隨時解雇你,但這也是你的優勢-你可以隨時離開。 另一種我個人認為最理想的方式是提供定制的服務。Fiverr 是一個很好的網站。你可以選擇一個利基,定義你的精確服務,讓人們「選擇你」而不是試圖尋找客戶。 選擇一個利基很重要。自由職業是一項專業化程度很高的工作,專攻於某個特定領域的頂級專家可以獲得更高的報酬和更好的機會。 有時這些一次性的小型服務可能會變成更大的合同或持續的合作關係。 如果你缺乏自信,這是正常的。只需從小事做起。你能做些什麼?你能審查技術博客文章嗎?你能照顧 Gatsby 或 Hugo 的博客嗎?你能進行重新設計嗎?你不需要開始建造移動應用程序或大型的 React 網站。 當然,如果這是你的專長,你當然可以這樣做。但不要以為在你能開始之前你不夠好。 如果這讓你感到更舒服,你可以從低價開始,但也請記住不要將自己定位為廉價替代品,低估自己的服務。迅速轉向適當的收費,這將為你吸引更好的客戶,減少壓力,從事更有趣的項目,從任何角度來看都更好。 同樣,不要害怕解雇你的客戶,如果那不是你想專注的項目,拒絕工作。學會說不。

如何作為開發者建立被動收入

我剛在一次訪談中讀到開發者的一段話: 軟體業務非常了不起,一旦你成功運行起來,特別是訂閱型應用程式。如果你建立了一個讓人們願意訂閱並保持合理良好保留的產品,你就不需要每天為它工作,它仍然會持續帶來收益。 這對我來說很正常,因為我已經試圖建立一個“被動收入”業務超過十年了,但這在我所謂的“線下世界”中相當不尋常。 作為開發者,你可以做一些能夠創造“永久”收入而不需要你做任何事情的事情。 你不需要成為一個創業家類型的人才能這麼做。如果你為某人工作,基本上你就被雇用來這麼做。 你建立的系統將在長時間內為公司提供價值。 要多長時間則視情況而定。想像一下,你是創建Craigslist的人。 一旦建立起來,系統在長時間內沒有發生太多變化。或者想像一下建立Google的第一個版本。我是說,它在這些年裡肯定變化了,但原始的想法仍然存在。有一個框,有人輸入,它給你結果。 他們可以輕易地說“好,讓我們停止對此進行開發”,它將在未來的10年、20年、100年內以同樣的方式運作,直到出現更好的東西。 當然,這就是非被動性的表現。為了保持相關性,你必須持續開展對你所創建的事物的工作。 想像一下,在2009年建立了一個移動應用程序或網頁應用程序,現在它看起來就像古董一樣。最好的應用程序不斷地自我革新,不斷變得更好。 被動的是,你可以指望它帶來未來的收入。 你已經建立了一個系統,讓人們會持續回頭使用。 你已經建立了一個訂閱你的應用程式的用戶群,他們繼續為此付費,因為他們覺得它非常有用。 你已經建立了一個有價值的產品,它基本上可以自我銷售。 使它與眾不同的是,你可以獨自完成這一切。 當然,在線下世界中,你可以創建一家商店或任何一種服務公司,然後雇人管理它,這就是“被動”。除非你需要大量資本來啟動,然後你的工作變成了管理那些你雇用的人。或者你雇用某人來管理那些人,但最終你還剩下多少? 憑著我們所知道的軟體產品的高利潤,這就簡單了許多。 它甚至不僅僅適用於開發者。開發者有另一種方式,就是創建一個移動應用程式、桌面應用程式或網頁應用程式。 但一般來說,任何人都可以創建一個數字產品並從中獲得被動收入。電子書和課程就是兩種方式。你只需要創建它們一次,然後永遠銷售,或者直到它們過時為止。 對我來說,被動收入是夢寐以求的。 不是因為我懶惰。 當然,我確實有點懶惰。 但一旦我創造了某些東西,理想情況下,我希望它能夠“自行運行”,然後我想創建新的東西。 即使事情不是這樣運作的。 也許,如果你安靜的推出一個東西,它失敗了,沒有人關心。 但如果一個東西起飛了,它幾乎不是被動的。 首先,有支援問題。人們遇到問題,他們需要答案,你需要關心。 如果你認為我的課程是“被動收入”,意思是我不需要做任何事情來運營它們,那你在跟我一起度過一天後,你的想法就會改變。 它從低活躍期到高活躍期的變化,但我不想做其他事情。 教授編程是我的夢想。我不僅可以談論我熱愛的事情,還可以幫助其他人實現他們賺錢編程和獲得一份好工作的夢想。 但就是因為這樣,它仍是被動收入。有一個人加入課程不會有太大的變化。我不需要加倍努力。當然,20個人而不是10個人,我會收到兩倍的支援郵件,但僅此而已。 我也可以雇人來處理支援,但我喜歡與學生保持聯繫。 也許有一天,誰知道?聘請一個人來處理支援。聘請一個人來改進課程。 那時它將是100%被動。

如何吸引讀者到你的部落格

擁有一個部落格很棒,但讓人們真正閱讀你的部落格是非常滿足的事情。 然而,有個問題:你該如何讓人們閱讀你的部落格呢? 部落格流量的運作方式 在當今的世界中,如果你不提供有價值且持續的內容,你將是看不見的。每天有太多東西被推送給我們。 我每天致力於網絡,大約花費30分鐘到1小時的時間。這意味著社交媒體,主要是Twitter、RSS和內容聚合器。 我總是看到同樣的人。那些非常成功的人總是持續不斷地推出優質內容。 這可能是一個鼓舞人心的推文,一篇被分享很多的優質博客文章,或者只是值得一讀的內容。 除非你有相同的表現水平,否則你不會出現在我的動態中,因為我只花有限的時間在上面。我假設絕大多數人也是這樣。人們不會一整天都在社交媒體上等著你。 在人群聚集的地方分享你的作品 分享你的內容是一個很好的激勵因素,特別是當你的部落格剛起步,還沒有讀者的時候(稍後會講到這個)。 在這種情況下,你不能依賴有機流量。為了避免失去動力,關鍵是透過分享你的內容來獲得第一批閱讀量。 你可以做兩件事:如果你已經有自己的觀眾,可以在社交媒體上與他們分享,或者使用提供觀眾的網站並試試你的運氣。 這些網站包括Reddit、Hacker News、Medium和專門討論你談論主題的論壇。但要小心:你在這些地方可能會受到批評,做好心理準備。 長期流量只能依靠有機增長解決 也許你會有幸運的一天,你的部落格文章在Reddit、Hacker News或社交媒體上爆紅。 但對於你的部落格來說,有機流量是關鍵。 有機流量意味著Google收到用戶的搜索,並決定顯示他們你的部落格文章。 對於每個網站來說,有機流量都是關鍵因素。社交媒體的流量通常品質較低,難以獲得並且難以長期維持。 這是一個漫長的過程。Google需要信任你,這可能需要一些時間。 我最好的建議是通過持續解決人們的問題,給Google一個顯示你的部落格文章的理由。 解決人們的問題 如何讓Google(和其他搜索引擎)將大量的流量發送到你的網站? 對Google來說,重要的是滿足自己的用戶。 這些用戶就是在搜索答案。 人們搜索是為了解決自己的問題。 我看過一些SEO專家建議你撰寫3000多字的文章以在Google排名。 如果他們的目標是讓你不再寫作,那是一個很好的建議。他們稱之為長形內容。 現在,作為一個非SEO的人,但作為一個實際行動並觀察哪些方法有效和哪些方法無效的人,我可以說,如果你用一篇四行的博客文章解決了一個人的問題,Google會通過送更多有相同問題的人來感謝你。 他們可以使用他們的算法知道一個人是否找到了他們所需的答案。這是Google的工作。他們的工作就是通過提供他們正在尋找的完美內容來解決人們的問題。 如果你能提供這樣的內容,Google會幫助你。 當然,你的部落格上不是每篇文章都能解決問題。但如果你有解決問題的文章,你會開始注意到這一點,因為這些是訪問量最多的文章。 當然,不是每篇文章都必須短小,如果對你來說長形內容更好,那就寫長形內容吧。 鏈接的重要性 之前我們在談論選擇一個好的域名時提到了域名權威性。我說一個老的域名可能會有更高的域名權威性。 什麼是域名權威性? 域名權威性是搜索引擎用來設定網站重要性的一種分數,它由許多不同的因素決定。具體的算法和指標並未公開,但有一件事對域名權威性至關重要,那就是鏈接。 一個網站有越多的鏈接,它的權威性就越高。但事情並非如此簡單。鏈接來自的域名權威性越高,該鏈接就越重要。 不同的鏈接具有非常不同的影響力。來自維基百科的鏈接比來自隨機推文的鏈接具有更大的影響力。搜索引擎也會考慮到社交指標,但我們無法確定,來自你所在領域有影響力的人的推文鏈接比來自Twitter機器人帳戶的推文鏈接更重要。 Google(我說Google是因為它是最重要的搜索引擎,但其他搜索引擎可能會做類似的事情)也會關注主題。如果我從我的電腦編程部落格連接到一個廚房食譜網站,那鏈接就不會有太大價值。 如果一個知名的廚房食譜部落格連接到一個較小的廚房食譜部落格,那對Google來說更有價值,它會賦予該鏈接更多的意義。 當涉及鏈接時,從相關且與話題相關的網站獲得鏈接很重要。 這只有通過提供出色且有用的內容才能獲得。

如何找出佔用特定通訊埠的程式

有時在同時開發多個應用程式或測試程式時,我會在電腦上運行多個程序,每個程序使用不同的通訊埠,例如:3000、3001、1313 等等。 如果不仔細注意,我可能會忘記哪個應用程式使用了特定的通訊埠。 我們可以用 lsof 命令來確定哪個程序正在監聽某個通訊埠。 執行以下命令: lsof -i :1313 將顯示當前在通訊埠 1313 上監聽的程序: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME hugo 8698 fla 4764u IPv4 0xc72ca30d18e45ef9 0t0 TCP localhost:bmc\_patroldb (LISTEN) 在這個例子中,佔用 1313 通訊埠的程序是 hugo,其進程 ID 是 8698。 如果要結束該程序,只需執行 kill 8698 命令即可。

如何找到 Mac App 的 Bundle ID

最近在運行一個腳本時,我需要查找安裝在我電腦上的某個 App 的 Bundle ID。 Bundle ID 是一個看起來像網域名稱的字符串,但是寫法與常規的相反。 例如 com.apple.finder 或者 com.microsoft.VSCode。 這是你可以使用的腳本: osascript -e 'id of app "Finder"' osascript 是一個運行 AppleScript 的工具。這段 AppleScript 代碼 id of app "Finder",會向 Mac 請求傳遞給它的 App 名稱對應的 Bundle ID。

如何找到一份軟體工程師的工作

尋找第一份程式設計工作的技巧和策略 在這篇文章中,我想引導你找到科技領域中的第一份工作。 一旦你進入這個領域,轉換工作、提升薪資就會變得容易許多。但是,獲得第一份工作可能是最困難的。 如何準備應聘工作 在考慮申請任何工作之前,你必須做好準備。這可能需要幾週的時間,如果你從零開始建立自己的線上形象,甚至可能需要幾個月。不是所有我在這裡提到的事情都是獲得工作所必需的,但它們肯定會幫助你。 我認為,在你的學習過程開始時就開始做我提到的事情是一個重要的加分項。我的建議是在你的博客上公開記錄你的學習過程。 在你自己的域名(yourname.com)上建立自己的網站,讓它成為你在互聯網上的家。你的所有線上存在都會回歸到這個地方。 我個人不建議使用像 Medium、dev.to 和其他基本上只是聚合器的平台,因為在你自己的博客上寫作更有份量。任何時候在你的博客上發布任何內容都會提升你的個人品牌。這是你的財產。就像在自己的財產上建造,而不是在別人的財產上建造。 這是我第一個建議的事情。開始每週寫一篇博客文章,解釋你正在學習的知識。這有兩個好處:一方面公開記錄你的知識,另一方面它可以幫助你巩固學到的知識,因為在你需要解釋某些東西的時候,你會更加理解它。 不要害怕被評判,也不要陷入“我知道得很少”的陷阱。你知道的仍然比99%的人多,隨著時間的推移,這將成為一個堅實的知識基礎,并且對你的個人品牌會產生積極的影響。 試著在Google上搜索你的名字。第一個搜索結果應該是你的博客。負責招聘的人會在Google上搜索你的名字,確保你在互聯網上的形象正確地體現你作為一名專業人士。 盡可能精心維護你的線上形象。 在你的博客之後,是社交媒體。Twitter 和 LinkedIn 是兩個最明顯的科技專業人士的網站。 Twitter 用於建立聯繫,LinkedIn 也有助於接收招聘人員的提議,他們的工作就是為公司尋找合適的人才,然後收取佣金。 招聘人員可以提供很大的幫助,所以保持一個最新的 LinkedIn 個人資料是值得的。 在這些社交網絡上也值得活躍,也許發布一些關於你學習和進展的更新。我稱之為公開工作。 我認為公開工作永無止境。如果將其視為你的文化之一,它將對你今后的職業道路產生重大影響。 你將建立連接和友誼,這在下一階段尋找工作時將非常重要。 接下來,你有 GitHub。GitHub 是你的代碼所在的地方。每個科技公司的招聘人員都會查看你的 GitHub 個人資料。填寫自己的個人作品集是一種良好的方式。我強烈建議你開發自己的項目,作為作品集的一部分。也可以找到課程中的現有項目,并增加新的功能和特性。把它們放在 GitHub 上。想象一下,如果你在一家公司應徵時有10到15個精心完成的項目,即使規模小,也會給人留下深刻的印象。 招聘人員會查看這些項目,他們立刻就能看到你的能力。你立即超越了競爭對手。 決定你想應聘的工作類型 在應聘工作之前,你需要決定想要應聘的工作種類。 其中一個最大的問題可能是遠程或現場。對於你的第一份工作,我強烈推薦現場工作,因為你在開始時需要大量的指導,而且從人性的角度來看,這更好。 在家工作可能會讓你感到更孤立、更缺乏動力。 你總是可以以後轉換到遠程工作。 另一個重要問題是你想要應聘一家大公司還是一家小公司。這是一種偏好問題。我總是會選擇一個小公司而不是一個大公司,但這只是我的個人選擇。如果你的夢想是在 Google 工作,那太棒了。如果你的夢想是在一家有6-8個人的公司工作,并與公司的每個人成為朋友,那也很棒。 另一個重要問題是科技在公司中的角色。科技第一的公司是以科技為基礎的公司。其他公司則是使用科技來提供主要產品,但科技並不是產品本身。我總是會選擇以科技為基礎的公司。他們會在你身上投資更多,你不需要爭取應有的工具、培訓、預算和科技選擇的考慮,科技始終是重中之重。 尋找工作和機會的地方 在互聯網上尋找工作的最明顯的地方就是在線工作板,但那可能不是最好的選擇。 要避免的一件事是盲目地大量發送簡歷。 不要追逐明星公司。每個人都想在很酷的公司工作,但他們可能有太多的應聘者而沒有機會。 我通常給出的建議是挑選3-4家你喜歡的小公司,無論是在你所在地區還是你想搬到的地區,盡你最大的努力讓自己被他們認識。 小公司總是在當地尋找人才,當有一個你可能能填補的職位空缺時,他們會想到你。 我建議參加當地的科技活動和聚會。無論是你所在地區的小型會議還是大型會議都可以。活動是你與其他人建立聯繫的地方。我認為建立聯繫非常重要。你認識的人越多,線上或線下,你現在和將來就會有更多的機會。許多公司定期組織活動來“尋找人才”。在大型會議上,你可能會遇到在招聘人員的公司工作的開發人員。這就是我找到一些機會的方式。 也可以嘗試在線工作職位上尋找工作,尤其是當你想在不同國家工作時,因為在你自己的國家找不到好的選擇。每家公司的網站上都有一個“招聘”頁面。用精心製作的求職信申請他們的工作。

如何更改 DOM 节点的值

给定一个 DOM 元素,如何更改它的值? 更改 innerText 属性的值: element.innerText = 'x' 要查找该元素,可以结合使用 选择器 API: document.querySelector('#today .total')

如何更改 Next.js 應用的端口

了解如何在開發模式下更改 Next.js 運行的端口。 有人問我如何在本地運行使用 Next.js 構建的應用時更改 HTTP 端口。 默認情況下,端口號為 3000,但這是一個常用的端口,也許您在該端口上運行了其他服務。 如何更改它呢? 答案在 Next.js 應用的主文件夾中的 package.json 文件中。 默認情況下,文件內容如下: { "name": "learn-starter", "version": "0.1.0", "private": true, "scripts": { "dev": "next dev", "build": "next build", "start": "next start" }, "dependencies": { "next": "9.3.5", "react": "16.13.1", "react-dom": "16.13.1" } } 注意:您的情況中確切的套件版本號會有所不同,因為它們會更新 您需要更改的是 scripts 部分。 將: "dev": "next dev", 更改為 "dev": "next dev -p 3001" 以將 Next.js 啟動在 3001 端口而不是 3000 端口。 現在,當您運行 npm run dev,這個命令用於在本地啟動開發服務器,您將看到它在 3001 端口上啟動:

如何更新 Node.js

了解如何正確升級您所安裝的 Node.js 版本。 Node.js 可以在系統上以多種方式安裝,升級指南取決於您最初的安裝方式。 如果您使用官方包進行安裝 最簡單的安裝 Node.js 的方法是從 Node.js 網站 下載官方包。 官方包包含一個安裝程式,該程式將檢測現有的 Node.js 版本並覆蓋為新版本。 如果您使用 Homebrew(在 macOS 上)安裝 Node Homebrew 是在 Mac 上安裝 Node.js 的一種非常流行的方式。 如果您確實使用了 Homebrew,升級 Node 就像運行以下命令一樣簡單: brew update #確保 Homebrew 是最新版本 brew upgrade node Homebrew 可能會要求您升級 xCode 版本以編譯包。 如果您使用 nvm nvm 是運行 Node 的一種流行方式。它允許您輕鬆切換 Node 版本,安裝新版本來嘗試並在出現問題時輕鬆回滾,例如。 它還非常有用,可使用舊版 Node 測試您的代碼。 使用 nvm 時,可以通過輸入 nvm current 來檢查當前運行的版本,這與 node -v 給出的結果相同。 要列出所有已安裝的版本,運行 nvm ls。 您可以使用 nvm install <VERSION> 安裝新的 Node 發行版(或任何舊的 Node 發行版),例如:...