全端獨立開發者

當我們想到軟體開發者時,我們會想像一個經常待在電腦前的人,專注於創建某種改變世界的應用程式,花整晚改善軟體程序的效能,整天修復錯誤,或試圖創建下一個機器學習演算法。 對於許多從事傳統職業的開發者來說,這可能是真實的。他們為大公司、初創公司、銀行或其他雇主工作。 我們中的一些人,包括我自己,正在經歷完全不同的職業生涯。 有時候我會在YouTube上觀看一個關於某個非常冷門的編程話題的會議演講,然後我就想,“這個人是從哪裡找到時間學習這些東西的”? 對我來說,一天根本沒有足夠的時間去觀看那個演講,更不用說要先發現所有那些東西。然後我提醒自己,我與眾不同,我是全端的。 在網頁開發中,全端指的是你既做前端又做後端。但在這裡,我給全端一個不同的意義。這個意義是我通過Thiago Forte的這篇文章發現的,而我是通過Mr RIP的這篇文章發現的。 我是一名獨立的軟體開發者。我從…讓我查查…從一開始就是獨立的。我從來沒有被任何人雇用過。我從來都不是僱員,是承包商,自由職業者,但從未是僱員。 回顧過去,我一直是一名兼職承包商。一半時間工作來支付生活費,另一半時間用來開發自己的獨立項目。網頁應用程式、手機應用程式、開源軟體、CMS插件、主題、桌面應用程式、培訓項目,我嘗試過一切。有時是愚蠢的想法,有時不是。 在作為受僱的軟體開發者工作時,你需要的技能與作為獨立軟體開發者時需要的技能之間存在著天壤之別。 想像一下,你想創建自己的軟體產品並獨立銷售。 你必須扮演很多角色! 你必須知道如何確保你所工作的項目是一個好主意。這並不是簡單的,還涉及運氣和時機。 你必須擅長品牌設計,為你的應用程式想出一個令人難忘的名字。 你必須是一個優秀的設計師,能夠設計好看的登陸頁面。 你必須是一位優秀的文案撰稿人,知道如何在這個登陸頁面上說些什麼。 你必須是一位網頁開發者,來創建登陸頁面。 你必須是一位運維專家,負責部署登陸頁面。 你必須擅長營銷。這是你知道如何收集首個測試版的電子郵件的方法。 你需要有一些法律條款。隱私、條款、GDPR… 我有什麼遺漏嗎?哦,是的,我們還沒開始為你想要銷售的軟體產品工作。 你必須很擅長這個。出色的執行能力、堅實的後端、可擴展的架構、優秀的UI和UX、安全性。 你需要知道如何部署應用程式,如何快速部署更新,如何避免在遷移中崩潰。 然後你需要擅長營銷。我希望你已經有了一個感興趣的目標群體,否則你會發現“建立了它們就會來”的不真實性。你需要知道如何撰寫被潛在客戶打開的電子郵件。 你需要學習如何搜尋引擎優化,如何進行內容營銷,如何銷售,在播客或YouTube頻道上作客以提高對你的產品的認知度。 我希望你是一個出色的演講者,最好是一個以英語為母語的人。 當然,你可以雇用某人來幫助你。我提到了大約15個不同的專業領域。其中一些需要至少五個人的團隊。 現在讓我們獲得一些風險投資金錢,每個月支付這些30-40人的薪水,希望你已經有了一些在矽谷的好聯繫! 除非你像我一樣是一個全端獨立開發者,並且你非常喜歡做這些事情。戴上你需要戴的所有帽子,讓你的創作落地並交到客戶手中。 而在99%的情況下,最終你會失敗,花時間閱讀Indie Hackers上的成功故事。 或者也許你會屬於那1%,並且獲得成功。

如何估計編程時間

預估建立軟體所需時間的精細藝術 我真的很想告訴大家我如何估計建立軟體專案所需的時間。 在過去的十年中,我已經被問了數百次這個問題。 “我們需要實現這個功能。你需要多長時間?” “請給我一個詳細的概述,這個專案需要多長時間。一個月?兩個月?” “我希望你發布這個。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%。 團隊專案的估計甚至更困難,我甚至不會嘗試。 那麼該怎麼辦呢? 與其詳細估計,我建議與委托你工作的客戶、老闆或其他人進行持續溝通,每周檢查專案進度。而不是預先設定結束時間。 因為終究這個過程永遠不會結束。

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

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

如何管理軟體專案

專案管理是一門藝術。這門藝術有很多不同的詮釋方式,你可以花很多時間學習它。 在亞馬遜可以找到很多關於這個主題的書籍,在網上也有很多不同的觀點。 對於什麼構成了一個好的專案管理策略,沒有明確的答案,但在這篇文章中,我想和你分享我對如何管理軟體專案的看法。 快速開始的方式。 當你開始一個專案時,第一件事就是進行計劃,而不是馬上開始寫程式。 寫程式可能在你開始計劃後的一週或更長的時間內才會開始。 你首先進行需求分析階段,就像我在這個課程的第三個模組中解釋的那樣,在第一週中進行。 我建議你使用一個專案管理工具,有很多這樣的工具。 我會使用像 Notion 或是 MindNode 這樣的思維導圖工具。 在團隊環境中,計劃階段是一個協作的過程,建議使用可以協作的工具,像是 Basecamp 這樣的工具。 開會和互相交流,定義你將要建立的東西和制定一個初始的路線圖。 初始的路線圖不可能是最終的路線圖。 這是因為一開始你忽略了太多事情。 你正在盡力創造一個具有很多不確定性的東西。 你所提出的任何計劃都只是猜測。 這就是為什麼敏捷開發運動如此迅速發展的原因。你可以閱讀像《敏捷開發的藝術》、《精益运营》、《精益創業》等等書籍,找到很多有趣的信息。 另一本很棒的書籍,尤其是針對軟體的,是《真實世界開發》,你可以在 basecamp.com/gettingreal 免費閱讀這本書。 我的建議是先確定一個MVP,一個最小可行產品。這是定義中最小的產品,它能解決你所面臨的問題。 有很多關於如何確定正確的問題和建立正確的產品的事情需要討論,但我假設你正在為一個委託你的客戶開發一個產品。 明確設定界限,堅持那些構成應用核心的基本功能。對於第一個MVP的迭代應該要快速,以便能快速得到與客戶的反饋。 盡快把第一個版本推出去,因為那時真正的學習才開始。 從那個時候開始,你將不斷迭代,直到把產品做得正確為止。 團隊越大,問題越複雜,專案經理需要更有經驗,這就是為什麼專案管理不是你的第一份工作,可能只有在作為開發人員工作多年之後,你才有責任去做這件事情。 在某個時候,你會超越開發,不再只是"寫程式",並且承擔更多的責任,那時你可能會轉向專案管理。 這是常見的進步路徑,雖然並不是你被迫成長的路徑,但通常也會帶來身份和經濟上的好處。

我是如何決定創建一個新的專案管理應用程式的

在過去的幾年中,我建立了許多應用程式。其中大部分是為iOS開發的,一些是為Mac,還有一些是為Web開發的。回顧過去,其中大部分都只有一些小型的目標,但有些很有前途,比我想像的還要大。但它們最終都未能成就。隨著時間的推移,我把所有這些項目都放棄了。 其中有一些應用程式可能只是能夠“存活”,但軟體最終會像水果一樣過期。如果你不不斷更新以符合作業系統的使用者介面並持續維護它,軟體就會消亡。 在過去的幾年裡,我專注於教導開發者創建Web應用程式,這是我找到巨大個人滿足感的地方。 這也是我未來計劃將所有注意力放在的地方:成為一位計算機編程教師,並每年組織我的JavaScript全棧訓練營。無論是在不久的將來還是長遠的未來,我都計劃如此。 但最近我又開始了一個新的應用程式開發。 有人說“不要從一個想法開始,而要從一個問題開始”。 事情是這樣的:我當時同時在進行許多不同的專案,而我希望有一種很好的方式來管理它們。 我接下來要在我的電子元件探索之旅中做什麼?我上一次做了什麼? 為什麼我停止了那個木桌專案?哦對了,我需要開車1小時去商店。 我要買什麼東西來完成車上新電池升級的計畫?哦對了,我已經放在亞馬遜購物車裡了。 我正在對JavaScript訓練營的課程進行重構,進展如何? 我找不到一個好的專案管理應用程式來幫助我,所以我使用了一堆不同的工具,如白板、紙張、電腦上的筆記、Things、WorkFlowy和MindNode。 這些應用程式都很不錯,但它們並不能完全解決我的問題。我可以用它們來解決我的問題,但是…不行。 於是,我開始研究人們通常用於專案管理的工具。噢,對了,我指的是專案們的管理。同時管理我所有的專案。 我在網絡上到處搜尋,但我找到的要麼都是待辦事項應用程式,要麼是團隊專案管理。是的,我也可以自己用這些工具,但這些工具都假設你與團隊一起工作。 為什麼呢?為什麼我不能有一個一流的使用體驗,而不需要那些專為團隊使用的功能,這些功能只會增加我的認知負荷? 我也在Twitter上詢問了,但沒有什麼結果。之後我又放棄了這個概念幾週。 然後幾天前的一個晚上,我重新開始思考這個問題,因為我意識到自己又在同時進行太多的專案了。我總是如此。我不能一個項目從頭到尾完工,我總是同時推進多個項目。這就是我的方式。 一個晚上的晚上11點,我開始在紙上畫一些東西。我畫畫很差,所以我不會向你展示結果。 然後幾天後,傍晚時分(我最有創造力的時間),我打開了Balsamiq Wireframes,開始畫一些畫面。 這個應用程式非常棒,因為它讓你能夠在不被細節困擾的情況下工作在概念上。我喜歡它。 過了一段時間,我準備好了兩個畫面。專案列表和專案詳情頁面。 沒什麼花哨的,沒有突破性的東西。 沒有商業計劃。沒有商業模式畫布。 說到這個,我必須說自己是一個獨立開發者,我喜歡閱讀工作在應用程式上取得成功的故事,不管是在使用者、產品市場適應或者獲利方面都成功了。 其中一些故事很令人驚奇,我尤其欣賞那些一個人獨立開發出了一些有意義的東西,這些東西現在為他們提供全職收入。 我很幸運,因為我通過我的線上編程培訓課程賺取了全職收入,所以我對這個應用程式沒有任何金錢上的期望。 我過去創建應用程式的所有嘗試都是嘗試創建一個可以成為我的全職收入的業務。 我認為這是一個關鍵的區別。金錢創造了某種期望,而99%的應用程式無法滿足這些期望。 去除了金錢因素之後,還剩下什麼? 那就是手藝。 我想創建這個應用程式不是為了出售它,也不是為了從中致富,而是要創建一個有用的軟體。一個美麗的軟體。 首先,我會每天使用它。 然後也許我也可以將這個應用程式發佈給公眾,看看是否有人喜歡它,但主要目標是為了自己建立它。 這就是我將基於的所有需求。我不在乎其他人是否需要額外的功能,因為我只想建立一個根據我對應用程式應有特性的概念而打造的應用程式。 如果這使應用程式足夠吸引人,讓其他人也找到它有用,那就太好了。 但首先,它必須成為我夢寐以求的應用程式。 我建立和維護的每一個應用程式都必須是我每天都在使用的應用程式。 對我來說,這是唯一的方法。我無法想像,基於我過去的經歷,我會去開發一個對我來說沒有用處的應用程式。不只是有用,而是必不可少。 我認為這種應用程式是必不可少的,就像對我來說,思維導圖、簡單的待辦事項清單和日曆一樣必不可少。 我想要使用Notes來記錄快速筆記,MindNode和WorkFlowy來整理思緒,但是當要管理一個專案時,我希望使用我的工具。 我會每天使用它,以俯瞰整個專案,看看我正在主動工作的專案,我暫停的專案,我完成或取消的專案。 我會用它來決定我當天要工作在哪個專案上。除非有一些期限緊迫,我可以自由決定該做什麼工作。 我會用它來查看專案的當前狀態,它的下一個里程碑和到目前為止的時間軸,還有其他詳細信息。 我會用它來回顧我的進展,當我問自己“過去幾週我完成了什麼?”時。這對我來說很有說服力,因為我記性不好,往往會忘記我完成的工作。 看,我會用它做很多事情。 這使得它值得探索,儘管這樣: 我真的想要這麼做,這不是幾天之後就消失的一時興趣 我真的願意為它的創建和維護付出多年的時間 讓我們看看。 更新 2023:放棄的專案 😄

軟技能讓軟體開發人員繁榮

面試過程也是用來評估您的軟技能的。 什麼是軟技能? 我會將與技術無關的任何事情歸類為軟技能,而是與與他人相處有關。 軟技能對任何人都是必不可少的,尤其是對於在團隊中工作的人,這是您在99%的工作中都要做的事情。 每個人都有自己認為最佳的軟技能版本。 我會提到以下這些: 身體語言 共情 對新技術持開放態度 你不是你的代碼 擁抱改變 持續學習 提問 身體語言 試著練習在面試時保持舒適。 當然,你面試得越多,這一點就越容易。 身體語言是一門藝術,當我們緊張時,甚至不需要說一個字,就可以清楚地展示出來。 共情 共情是能夠站在別人的立場上,理解他們的感受,理解他們為什麼以某種方式行為的能力。 我把這個放在第一位,因為缺乏共情可能是許多問題的根源。 理解對方的觀點,積極聆聽並友善對待。 對新技術持開放態度 在面試過程中,您可能會被問及是否願意學習X框架或Y語言。 作為一名開發人員,開發渴望學習您所能學到的一切是至關重要的。 您將始終學習新事物。 你不是你的代碼 您的代碼總是會受到批評。無論它有多好或多壞,你不是你的代碼。您的代碼並不是您能力的證明。它只是在特定時間點下特定限制條件下您的工作產物。 如果招聘人員認為您的代碼不夠好,可能有原因,您不應該感到個人冒犯或煩惱,也不要使面試出現偏離。 您在當前情況下已經盡力了,但下次可以做得更好。 擁抱改變 派生於您花了很多時間學習的特定技術、框架或語言的喜愛是很容易的,並且認為它是有史以來最好的工具。 但在團隊環境中,許多時候您喜歡的技術、框架或語言可能會被換成另一個更好的工具。 對於變化始終保持主動態度,不要過於依附於任何事物。 在面試中展示出您是開放的思維方式很重要。 提問 保持好奇心。不要假設任何事情,而是主動提問。 提問意味著在下結論之前收集所有需求。 在面試中,問問題關於公司。這是一次雙向面試。他們了解您,您了解他們。

軟體是超能力

我們往往對我們已經知道的事情看輕:「因為我們知道它,每個人都應該也知道這個」。 但有一件事我永遠不會視為理所當然,那就是軟體賦予我們的力量。 不僅僅是寫軟體的能力,也包括簡單地擁有可以使用的軟體。無代碼工具已經非常先進,你可以用它們來做很多事情,並且它們將軟體的力量賦予給那些不是開發者而是專業使用者的人。 我是一個開發者,我也依賴低代碼或無代碼工具。它們能為你提供自動化的關鍵,將這種力量帶給更廣泛的受眾。 每當我做某件事情多次,我都會考慮建立一個系統,這樣我就不必手動重複執行該任務。 我是一個獨立工作者,之所以能做到這一點,完全是因為我有一支小機器人軍團,每天24小時工作,為我完成各種任務。別以為它們做複雜的事情… 它們實際上執行的是小任務。但這些小任務卻花費了我大量的精力和時間。 因為它們替我做這些事情,我可以專注於更大的圖景。 系統思維也是與此相關的一項重要能力:構建一個相互關聯的自動化系統,使其在你睡覺、度假、或者外出跑步時為你工作。 數千年來,人們只能夢想這種可能性。相反,他們不得不雇用人工。無論是有薪水的工人還是奴隸。他們不得不建造或購買昂貴且脆弱的機器。自從幾年前,不算太久之前,我們就有了一系列令人難以置信的工具,將這個千年長夢變為現實。我們在口袋和手腕上擁有極其強大的電腦。 我們應該百分之百地利用這個可能性。 如果你意識到這個機會,你已經走在正確的軌道上。這不是你天生擁有的。你可以學會它。這需要時間和大量的學習。 在這方面,我依賴於各種平台。我喜歡我的系統簡潔而小型。如果你喜歡的話,可以稱之為微服務。當觸發事件時,信息會被發送到我的自動化服務中,它就會按照預定的操作進行處理。 如果該任務失敗,並沒有很多東西需要尋找失敗的原因。而我的中央化日誌平台會告訴我發生了什麼、何時以及為什麼。 這正是讓我在數位領域成為一個獨立創業者的原因。