① 如何成为一名程序员 6种方法来成为一名程序员
目录方法1:网络编程1、了解网络编程的含义。2、浏览不同的网站,了解它们的外观。3、学习至少一种头脑风暴技术/方法,并学习一个用来实现头脑风暴的软件。4、熟悉网站结构。5、赶紧学一门图形设计的课程。6、了解网络下部构造的基本情况。7、巧伍轮学习HTML和CSS语言。8、学习XML及其相关技术,比如XSL和XPath(不是必需,仅作推荐)。9、先建立简单的静态网站,直至你熟悉并习惯HTML语言。10、学习客户端脚本语言。11、熟悉你所学的客户端脚本语言。12、学习至少一种服务器端脚本语言。13、学完服务器端编程语言之后就开始创建一个试验项目。14、获得你的网站,开始用你自己的网页实验。方法2:桌面软件编程1、弄清楚桌面软件编程是怎么回事。2、了解不同的电脑硬件结构。3、学习一种入门级(小孩子学的那种)编程语言。4、学习程序化、面向对象、函数设序设计规范的入门。5、学习一种程序化程式设计语言的入门课程。6、学习至少一种高级建模技术,比如UML 或ORM。7、开始编写一些小的主控台应用程式或类似的应用程式。8、学习一门你选择的编程语言的更高级课程。9、应用你所10、至少再学习一门编程语言规范的入门课程。11、试着比较你所学的两门编程语言。12、利用你学过的一种语言来学习可视化编程概念。13、开始把你所学的知识运用到你设计的软件小工程中。14、创建一个虚拟的"毕业工程"。15、通过学习更高级的课程、更加注意细节以及在网上学习搭建架构的技巧,来加深对你学过的可视化架孝信构/库/包的理解。16、搜索其他含可视化元素的包/库并学习它们。17、学习图形学课程(而非图形设计)。18、成为游戏程序员(不是必须的)。方法3:分布式程序设计1、处理分布式应用编程。2、快速了解通信系统及其硬件。3、熟悉网络硬件结构和设备,比如集线器、接线台和路由器。4、学习网络协议的课程。5、学习XML 语言,并熟悉它。6、开始学习一门shell脚本语言。7、开始时用上你学的脚本知识,只运用程序化程式设计。8、使用你所学的脚本语言,写出实现机器之间通信的脚本。9、转移到桌面脚本/编程语言。10、专注于语言的核心部分,尤其hi那些支持网络。11、学习分布式应用设计与结构的课程。12、使用你所学的编程语言来了解服务部分建构和服务。13、学习如下技术中一种或更多。方法4:库/平台/框架/核心编程1、了解什么是核心编程。2、学习一门支持创建可重复使用内容/包的编程语言,如果你还没学过的话。3、学习一门UML 和ORM的高级课程。4、学习软件工程的课程。5、学习至少一个模块,基于内容的、面对对象的和 事件驱动编程技术和概念。6、进一步了解不同的操作系统及其支持的编程架构。7、集中学习独立平台架构、编程语言和技术。8、如果到目前为止你学习的编程语言具有ANSI/ISO/EEE/W3C标准版本,那么掌握这些标准。9、尝试模拟简单的、已经建立的库,尤其是开源的库。10、在你的编程领域内寻找开源的包。11、学习不同方法。方法5:系统编程1、了解系统编程的定义。2、跟着"桌面应用程序员"的前三个步骤。3、橘山学习线性代数的入门课程。4、学习微积分课程。5、学习逻辑学和/或离散数学课程。6、了解不同的"准操作系统"。7、学习计算机硬件结构的课程(或者作为替代,看看书)。8、深入理解不同的计算机硬件平台。9、初步熟悉你所选择的硬件平台/操作系统的汇编语言。10、学习ANSI C 和 C++ 语言,还有程序化程式设计的一些概念。11、在你选择的平台上理解并实践C/C++标准库。12、搜索网络资源、书籍和课程来理解你的平台独特的C风格。13、用C/C++练习编写高级代码。14、学习更高级的Assembly。15、学习操作系统设计的课程。16、寻找并阅读你所选择的平台的相关文章。17、练习你已经掌握的知识。18、以最有益的顺序学习语言。方法6:编程科学1、了解编程科学家是做什么的。2、累积和四年制计算机科学学历同等多的科学知识。3、选择特定的领域。4、考虑获取更高级的学历。5、了解你选择的编程领域的相关技术和编程语言。成为程序员是一个日积月累的过程,需要日复一日年复一年的技能增长。编程本身是有趣的,并且有回报(脑力层面、精神层面、经济层面)。这份指南不能保证你轻松当上程序员。不要神化下面这些步骤,从中你大概能了解在现今编程界如何成为一名程序员。
方法1:网络编程
1、了解网络编程的含义。网络应用是指设计在网络结构顶层的软件部分。这就意味着这些应用是通过诸如火狐或IE之类的浏览器来处理的。架构于网络结构的顶层并不一定要连接到网络。这就是说网络应用建立在如下标准网络技术的顶层:HTTP
FTP
POP3
SMTP
TCP
IP协议
HTML
XML
Coldfusion
ASP
JSP
PHP
ASP.NET
2、浏览不同的网站,了解它们的外观。(右击,选择"查看源"或按F12。)寻找网站类型/内容的多样性,而非数量。通常你需要访问以下网站类型中至少一种: 团体网站(商业公司,非营利机构/组织,政府组织)
网络索引引擎(搜索引擎,meta搜索网站,专业化搜索引擎,目录)
数据挖掘网站
个人网站
信息/网络全书式网页(维基,数据单,技术规格,人工列表目录,博客和日志,新闻和新闻机构网站,黄页,等等。)
社交网站(社交门户,书签网站,记录笔记网站)
合作网站(这包含了上面提及的目录,比如维基和博客)
3、学习至少一种头脑风暴技术/方法,并学习一个用来实现头脑风暴的软件。例如:头脑风暴图和微软Visio。
4、熟悉网站结构。指的是创建概念化网络范式、网络地图和导航结构。
5、赶紧学一门图形设计的课程。尽量学习至少一个图形编辑/操作软件包(不是必须的,但强烈推荐)
6、了解网络下部构造的基本情况。包括了解以下: 基本网络服务协议(HTTP,FTP, SMTP和POP3或IMAP4)
网络服务器软件(最好其中一个就是你以后主要工作的平台)
网络浏览软件
邮件服务器和客户端软件
7、学习HTML和CSS语言。或许你还想要"所见即所得"软件包来编辑HTML。
8、学习XML及其相关技术,比如XSL和XPath(不是必需,仅作推荐)。
9、先建立简单的静态网站,直至你熟悉并习惯HTML语言。
10、学习客户端脚本语言。多数人要么学Java,要么学VB,但也有一些人学习Perl和DHTML。
11、熟悉你所学的客户端脚本语言。潜意识里提醒自己只用你学的那个语言。只有在你熟悉你的客户端脚本语言之后才能进入下个步骤。
12、学习至少一种服务器端脚本语言。如果你只用一种服务器软件,那就学其中一种编程语言。否则,你得每个服务器软件都学至少一种编程语言。
13、学完服务器端编程语言之后就开始创建一个试验项目。
14、获得你的网站,开始用你自己的网页实验。
方法2:桌面软件编程
1、弄清楚桌面软件编程是怎么回事。多数桌面软件程序员都是编写商务需要的代码,所以好好了解一下商业及其组织和经济结构将对节省时间、提高效率大有裨益。
2、了解不同的电脑硬件结构。看看数字电路设计和电脑结构的入门级课程,但是也有人认为这对于刚起步来说太超前了,所以看两三篇说明的文章(比如 这一篇 和 这一篇)就够了。学完第一种编程语言后你可以再返回这个步骤。
3、学习一种入门级(小孩子学的那种)编程语言。不要因为你不是个小孩子就不好意思去学。这些入门级语言能大大减轻你正式学习第一门编程语言时的痛苦和压力。然而这一步也不是必须的。你也可以在上一步之前完成。
4、学习程序化、面向对象、函数设序设计规范的入门。
5、学习一种程序化程式设计语言的入门课程。无论你以后选择何种编程语言,在某种程度上它都要求程序化程式设计。此外,据多数程序员反映,程序化程式设计总的来说是了解编程的一个很好的切入点。
6、学习至少一种高级建模技术,比如UML 或ORM。
7、开始编写一些小的主控台应用程式或类似的应用程式。你可以利用编程书中的常见小练习。选择一个工具,用你所学的编程语言编写程序。
8、学习一门你选择的编程语言的更高级课程。确保进展之前先理解下列概念,并能熟练运用。对程序用户输入输出信息。
程式化设计语言写成的程序中的逻辑流程和执行流程。
声明、分配和比较变量
编程结构分支,比如if..then..else 和 select/switch..case.
循环结构,比如while..do, do..while/until, for..next.
创建、调用程序与函数的编程句法
数据类型及如何操控
用户定义数据类型(records/structs/units)及其使用
如果你的语言支持超载函数,理解它。
你选择的语言的内存处理方式(指针,变量窥视,等等。)
如果你的语言支持运营商超载,理解它。
如果你的语言支持delegates/函数指针,理解它。
9、应用你所学的高级技能 面向对象的规范
10、至少再学习一门编程语言规范的入门课程。推荐学习每种范式的编程语言,多数高级程序员确实是这么做的,然而,通常你开始时只学一种,应用所学知识训练了一段时间,获得了编程的鲜活经验,然后接着学习另一种。试试下面的语言: 逻辑编程范式
函数编程范式
面向对象的范式
11、试着比较你所学的两门编程语言。评估各自利弊。通常可按以下方法完成拿出你在学习第一门编程语言时编写的简单范例,现在用第二门语言重新编写。
创建一个工程,尽量用上两种语言完成它。有时取决于你选择的工程和语言,你可能仅用一门语言还无法完成这个工程呢!
写一份两种语言之间相似结构和独特之处对比的速查表或一览表。
尽量使用另一门语言找到模仿这两门语言中独特之处的办法。
12、利用你学过的一种语言来学习可视化编程概念。几乎所有的编程语言都具有支持可视化编程和其他支持控制台或类似控制台编程的版本/库。同时进行的包括: 初步了解事件驱动编程。在某种程度上,多数可视化编程依赖事件及事件处理(用上你选择的语言)。
尽可能多的尝试桌面软件,理解软件是做什么的。多数软件开发公司会提供产品的测试版,你可以拿来测试软件。在完善用户界面方面保持更新。
阅读关于图形用户界面的文章或教程。
13、开始把你所学的知识运用到你设计的软件小工程中。尽量把你的编程专业知识运用到你日常生活中的问题上。比如,编写程序,批量重命名文件,视觉上比较文本文件,复制目录里的文件名到内存/文本文件之类的东西。刚开始简单一点。
14、创建一个虚拟的"毕业工程"。把这个放到最后完成,用上你到目前为止学到的可视化编程技术。
15、通过学习更高级的课程、更加注意细节以及在网上学习搭建架构的技巧,来加深对你学过的可视化架构/库/包的理解。
16、搜索其他含可视化元素的包/库并学习它们。
17、学习图形学课程(而非图形设计)。对于想要写出吸引人的用户界面元素的程序员来说,这将大有裨益。
18、成为游戏程序员(不是必须的)。很大程度上游戏编程是被当作桌面编程的。如果你想成为游戏程序员,完成这些步骤后你需要进一步学习游戏编程。对于游戏程序员而言,图形学课程是必须的,后续步骤中第二门语言应该选择逻辑/函数编程语言(最好是Prolog或Lisp)。
方法3:分布式程序设计
1、处理分布式应用编程。分布式应用编程被许多人认为是最难学的一种,它要求计算机和通信技术中的不同知识。
2、快速了解通信系统及其硬件。这个步骤不是必须的,但是对于理解网络拓扑结构很有用。
3、熟悉网络硬件结构和设备,比如集线器、接线台和路由器。
4、学习网络协议的课程。在你开始分布式应用编程之前,你需要好好理解"开放系统互联 (OSI) "模型、以太、IP、TCP、UDP和HTTP 。
5、学习XML 语言,并熟悉它。
6、开始学习一门shell脚本语言。对基于Windows的编程,可以是任何能与Windows脚本宿主兼容的脚本。对基于Linux的编程,Bash脚本和 Perl就够了。对这两个平台都强烈推荐Java,原因如下: 几乎所有操作系统的都支持脚本宿主(Windows 脚本宿主默认支持java ,大多数Linux发行版都有支持java脚本控制的包)。
许多开发者认为它很容易学。
当你需要学第二门编程语言(C,C++,C#,Java和J#都有ALGOL开源句法)时,它拥有的ALGLO开源句法就能使你熟悉更多编程语言
通过学习java,你会熟悉网页的客户端脚本,这可谓一大福利!
7、开始时用上你学的脚本知识,只运用程序化程式设计。之后,根据你的脚本语言和它所支持的,你可以用上更高级的编程技巧和范式。所有的脚本语言在某种程度上都有程序化程式设计的一些方面。
8、使用你所学的脚本语言,写出实现机器之间通信的脚本。学习完成这个所必需的东西。简单的通信就足够了。
9、转移到桌面脚本/编程语言。一个比较好的是多范式语言,比如Python。简单了解第二门语言。有许多理由让多数程序员选择java。然而,在这个领域内C#正在获得多数优势。Java和C#被青睐的原因如下:它们是面向对象的编程语言,使大量程序员免遭实现细节之苦,因为它们都支持组成部分(代码单元、预编译,它们可以执行特定任务,并被用到其他程序中)。
它们支持事件驱动编程,在某种程度上还支持OO和程式化程序设计。
建立语言的架构按属性分布(比如Java)。
有许多现成的包来处理。社交网络同时作为开源代码和架构内置包,这使得程序员继续其他人工作更加容易。
10、专注于语言的核心部分,尤其hi那些支持网络。少注意用户界面元素,比如输出,窗口设计和技术等。
11、学习分布式应用设计与结构的课程。可以通过书本、网上教程或学术课程来完成。然而,十分有必要理解分布式应用的结构及其概念。
12、使用你所学的编程语言来了解服务部分建构和服务。
13、学习如下技术中一种或更多。推荐你每一种都了解以下。多数分布式应用程序员不会止于一两门编程语言,他们会每个操作系统各学至少一种语言。这是因为如果你希望你的应用"分布式",你应该至少为每个主要的操作系统各提供一个版本。公共对象访问代理体系结构(CORBA)
简单对象访问协议(SOAP)
异步JavaScript和XML(AJAX)
分布式组建对象模型(DCOM)
.NET远程处理
XML 网络服务
方法4:库/平台/框架/核心编程
1、了解什么是核心编程。核心程序员几乎都是高级程序员,已经从编写应用转变为给其他程序员编写代码汇编。
2、学习一门支持创建可重复使用内容/包的编程语言,如果你还没学过的话。
3、学习一门UML 和ORM的高级课程。多数库开发者使用其中一种,或两种都用。
4、学习软件工程的课程。
5、学习至少一个模块,基于内容的、面对对象的和 事件驱动编程技术和概念。你所学覆盖越多编程范式和语言,你就能成为越成功的库/包程序员。
6、进一步了解不同的操作系统及其支持的编程架构。
7、集中学习独立平台架构、编程语言和技术。
8、如果到目前为止你学习的编程语言具有ANSI/ISO/EEE/W3C标准版本,那么掌握这些标准。无论何时尽可能使用标准代码。
9、尝试模拟简单的、已经建立的库,尤其是开源的库。这在成为库/包程序员的早期阶段十分有用。从简单的包开始,比如单位转换和中间科学计算包。如果你是大学生,利用你的非编程课程,尝试把这些课程的方程式与核心科学用作库。
10、在你的编程领域内寻找开源的包。首先下载包的二进制/可执行文件。尽量去用,并发现它的利弊。之后,下载源,尽量弄明白它是怎么完成的。尝试再创造这些库或其部分。刚开始,看完代码再做;之后,先做再看代码。后期阶段,尝试完善那些库。
11、学习不同方法。给程序员分发、配送内容。通常,库/包程序员倾向于以递归和/或迭代的思想来思考他们面临的所有问题 。尽量把每个问题当作一个小问题的汇编(一系列更小的任务)或一个重复的不断缩小问题范围直至把这些更小的范围彼此堆到一起的处理过程去思考。
库/包程序员倾向于概括化。也就是说,当面临一个特定的简单的问题时,他们通常会想到一个更为概括的问题,并努力解决这个更概括的问题,如此,小问题便不攻自破。
方法5:系统编程
1、了解系统编程的定义。系统编程处理的是编程的"科学",而不是具体的编程实现。不要把你自己栓到特定平台上。
2、跟着"桌面应用程序员"的前三个步骤。
3、学习线性代数的入门课程。
4、学习微积分课程。
5、学习逻辑学和/或离散数学课程。
6、了解不同的"准操作系统"。这可以通过以下途径完成:了解操作系统是如何安装的。
了解在一台PC上如何安装不同的操作系统(不是必须的,但作为推荐)
安装不止一种操作系统。不要在系统中安装任何辅助包,相反,仅利用操作系统本身提供的函数。
7、学习计算机硬件结构的课程(或者作为替代,看看书)。
8、深入理解不同的计算机硬件平台。
9、初步熟悉你所选择的硬件平台/操作系统的汇编语言。稍后你会学习其他平台/系统的汇编。
10、学习ANSI C 和 C++ 语言,还有程序化程式设计的一些概念。
11、在你选择的平台上理解并实践C/C++标准库。尤其注意标准模板库(STL)和活动模板库(ATL)。
12、搜索网络资源、书籍和课程来理解你的平台独特的C风格。
13、用C/C++练习编写高级代码。
14、学习更高级的Assembly。
15、学习操作系统设计的课程。
16、寻找并阅读你所选择的平台的相关文章。如果你选的是基于Unix的操作系统就会容易得多。充分理解你今后将要用来工作的系统。
17、练习你已经掌握的知识。首先创建小的系统软件。如下通常很有用: 试着重创你系统中已有的小工具。
试着把其他系统中的应用移植到你的系统里。
18、以最有益的顺序学习语言。此处是唯一强调第一门编程语言的地方。首先学习ANSI C 而不是 C++、C#、Java 、D。然后学习 C++。限制你第一门语言仅为C是因为系统编程要求程序员熟悉如下概念:源代码真实、完全的编译
低级对象输出文件
链接二进制
低级机器语言/汇编编程。C语言被某些人认为是伪饰过的/更容易学习的汇编语言。只要你愿意,它还支持插入汇编语言代码,并且它只是程序化的(像汇编)。
方法6:编程科学
1、了解编程科学家是做什么的。编程科学家是十分高级的程序员,他们不开发程序,但他们研究计算科学,比如密码学、编程语言和数据挖掘算法。没有深入的学术研究是很难达到这个水准的。
2、累积和四年制计算机科学学历同等多的科学知识。可通过如下其中一种完成: 获得真实的学术学历(这也是通常情况)。
从现代大学中获得该学历要求的课程大纲,自学课程或 分开一门门学。理论上这样做也可以,但还是推荐第一种做法。
3、选择特定的领域。越具体越好。这取决于你的偏好。但是这里给出计算机编程领域中一些主要的课题:算法设计(例如搜索、分类、密码、解码、错误检测 等)
编程语言/编译器设计/最优化
人工智能领域(模式识别,语音识别,自然语言处理,神经网络)
机器人技术
科学编程
超级计算
计算机辅助设计/模式(CAD/CAM)
虚拟现实
计算机图形学(计算机图形学通常和图形设计或图形用户界面设计混淆,计算机图形学是研究如何表示和操控计算机系统中的图形的领域)
4、考虑获取更高级的学历。或许你想追求硕士学历或博士学历。
5、了解你选择的编程领域的相关技术和编程语言。
小提示不管你想尝试哪种编程,不管你想达到何种水平,考虑去学校或本地社区大学上课。不要被诸如“计算机科学”一类的术语吓到。你参加的任何不需要预备课程的课程都应该集中教一些编程的基础知识。在上课之前先咨询一下老师或客服,确保这门课是你想要的,像“计算机文化”这样的课很有可能更多地集中在教你更熟悉办公应用之类。
② 自学了编程,怎么在网上接单
作为一名开发者,该如何走向自由职业?
这正是这篇文章要讨论的问题,我们会先介绍开发者走向自由职业的 4 种常见方式,然后聊聊开始自由职业前必做的 5 种准备。最后,还会分享我个人的 2 点深切体会。
走向自由职业的 4 种常见方式
技术出色的开发者,通常具有下列能力:
软件开发,即针对特定领域问题,运用思维、分析、设计、想象力等寻找答案,通过语言、技术框架、工具等编写软件来实现答案的能力。
讲授,即把自己明白的技术、软件、解决方案等展示给别人并让别人也明白的能力。
咨询,即通过你所储备的知识、技能、经验、框架等帮助别人解决问题的能力。
热爱分享的开发者还会拥有另一项核心竞争力:写作。
软件开发、讲授、写作、咨询这四种能力,构成了开发者走向自由职业的 4 种常见方式。
软件开发
很多开发者都听说过“私活”,也接过私活。所谓私活,就是个人通过某种途径承接的软件项目,相对于公司的“公”而言,这种形式被称为“私”,现在这种方式还有很多说法,比如外包、众包、任务等。
这是我们开发者走向自由职业的最常见方式。
我个人帮助别人修改过开源代码,用 Qt 开发过 PC 端软件,对这种方式有一些体会。除了软件开发,你还需要下列能力:客户开发、商务谈判、项目管理。
这种方式很直接,不断开发客户,承接项目,赚取报酬。其好处是:你获得的报酬是按项目金额来的,而不是按月薪。套用某二手车买卖平台的广告语,没有中间商赚差价。
想想看,你在公司,一个项目是 100 万,你一个人一个月搞定了,也还是拿三几万的薪水;而如果你自己接到这个项目,一个月完成,那你这个月就赚到 100 万(暂不考虑增值税、个人所得税等隐性成本),天差地别对吧。所以,独立开发软件项目是诱惑力很强的方式!
这种方式也有一些比较困扰人的问题:你并不总是能接到项目。需求可能不断变化,你需要直接面对这点,还要管理这种状况:项目款不一定能及时到账,尾款也不见得能收回来。
还有,如果你想独自承接稍大一点的项目,你还需要注册一个公司来承接项目(稍大点儿的项目都是公对公),拥有一家公司,也会产生一些成本,比如代账、房产税、企业所得税等。
不过现在的众包方式,会好一些,像解放号、云沃客、码市、程序员客栈等平台,都有使用这种方式协作的项目,你只要做你擅长的事情——软件开发——就好了,别的事情由别人或平台来完成(你需要支付平台一些提现费用,一般10%左右)。
讲授
如果你具有良好的讲授能力,就能把自己在某个技术栈上深厚的积累换一个形式变现:讲课。
没错,你可以把自己学精学透的技术讲给别人听,把别人教明白。这是非常有价值的事情!
很多人在初学某种技术时都需要好的老师、好的教程帮助他们跨过从不知道到知道、从知道到做到的距离。
IT 技能类的课程,能帮助别人掌握一技之长,帮助别人赚到钱,需求一直很旺盛。这些年线上的平台发展很快,很多学员也愿意低成本在线学习,像 51CTO 学院、CSDN 学院、慕课网、极客学院、网易云课堂、腾讯课堂、淘宝教育等平台,都很受欢迎。
我个人录制过 Qt 和 Node.js 方面的课程,放在 51CTO 学院和 CSDN 学院出售,有些 3 年前的课程,现在还有人购买。
如果你可以运用讲授能力,把自己的技术积累转化为在线课程,就可以利用在线教育这种方式实现自由职业。
我所潜伏的 51CTO 讲师群里,有不少靠编程课程实现自由职业的讲师,原来都是开发者。在双 11 、IT 充电节等活动期间,有很多讲师一天销售额过万。
这种方式有几项好处:
●启动成本低
●受众面广
●一份时间卖多次
●想象空间大
写作
2013 年下半年,我恢复了 CSDN 技术博客的更新,专注分享 Qt 技术,很快成了 Qt 领域的知名博客,被不少人关注。后来一些文章被编辑看到,联系我出版 Qt 方面的图书,于是我通过 《Qt on Android 核心编程》和《Qt Quick 核心编程》等图书建立了影响力和品牌,反过来博客也因此拥有了更多的访问。
2015 年我开通了微信公众号,一周更新三篇文章,同年出版了《你好哇,程序员》一书。
2017 年 7 月份,凭借写作带来的自信,我离开公司,开始自由职业,通过写作、讲课等方式获取收入。
我的朋友杨开振,因为所着图书《深入浅出 MyBatis 技术原理与实战》销量很好,于 2017 年 4 月份离开组织,通过写作实现了自由职业。
写作是程序员自由飞翔的翅膀,它能帮你积累影响力,建立个人品牌,并且,也能够直接变现。对于开发者来讲,写作是通往自由之路最强有力的武器。
写作这条路具有无与伦比的好处:
●启动成本低
●个人可以独立完成
●可以直接建立影响力和个人品牌
●一份时间卖无数次
●有想象力
它最大的困难在于:
●如何写好
●如何捕捉到更为广泛且强烈的需求
●如何持续写下去
咨询
如果你看过《我的前半生》这部电视剧,一定对贺涵印象深刻,他做的就是咨询工作:用自己的知识、经验、技能、思维、框架等帮别人解决问题。
在 IT 领域,如果你有完善的技能树和丰富的经验,能够站在较高的层面上做全局性思考,善于寻本溯源地分析解决问题,也可以从事咨询顾问之类的工作,不受雇于特定的组织,直接为客户服务。
着名网站库壳的创建者左耳朵耗子陈皓,擅长底层技术架构,对高性能、高可用性、分布式、高并发,以及大规模数据处理系统有丰富的经验和心得。
他有段时间因为个人原因不能在公司上班,就通过为其他公司提供技术咨询来获取收入,并且,收入还蛮高。
我有段时间就希望通过为一些公司提供技术咨询来赚钱,但没有成功。
我还记得有家公司的老板对我说的话:你加入我们公司,带着团队把项目做起来,然后就可以成为我们的咨询顾问。
看见了吧,这就是独立咨询的难处:当你不够牛 X 时,没有人愿意为你不知所谓无法确认效果的咨询付费,开发客户很难很难。ThoughtWorks 的很多咨询顾问虽然有公司为其背书,也还是常常遭人诟病:你自己没做过什么项目,凭什么给我们提供建议?
虽然很难,但这确实是一条路,如果你有志于此,可以看看享誉世界 IT 领域的咨询顾问、美国计算机名人堂代表人物杰拉尔德·温伯格写的《咨询的奥秘》,那是圣经式的着作。
当然,除此之外,你还要在自由之前,就积累一些客户资源,并且为客户留下你具备咨询能力的深刻印象,这样他们才可能成为你自由后的衣食父母。
走向自由职业必做的 5 种准备
如果你确认了走向自由职业的方式,接下来就该做准备了。根据我的个人经验,下面 5 种准备是必须要做的:
●变现方式
●市场测试
●饱和度测试
●预期管理
●B和Z方案
变现方式
我所说的变现方式,包含两种:卖时间和卖产品。
这里的卖时间,指“一份时间卖一次”这种工作方式。你在企业内工作,就是在卖时间,朝九晚五,每天 8 小时,每个月领薪水。
以卖时间的方式实现自由职业,实质还是用你的专业能力为客户提供时间层面上的专属服务(你不可能在同一时刻为不同的客户服务),只是你不再受雇于企业,不再受规章制度约束,能够按照你自己的意愿安排在什么时间用什么方式完成服务。外包、众包、私活、咨询等方式,都是卖时间。
卖产品则是指“一份时间卖多次”这种工作方式,像我们前面提到的写作、在线课程等,都可以归为此类。它相比卖时间的方式,具有更大的想象空间,可以获得规模化的收入。可能你写出一本经典、畅销的书,做出一个爆款的课程,就可以获得几十万的收入。
在自由职业之前,你需要确认你最突出的能力,选定你首要的变现方式——因为你业余时间有限,不可能同时做很多事情。
市场测试
在离开组织自由职业之前,你需要测试一下,你赖以实现自由职业的变现方式,可以给你带来多大规模的收入。
比如你做技术课程,一定要先在业余时间开发几门课程,放到 51CTO 学院或者腾讯课堂之类的在线教育平台上去卖卖看,统计一下收入情况,看这些收入能不能维持你可以接受的生活水平。
比如你写书,也要出版一本,观察半年,看看销量,看看能拿到多少版税。前面提到的杨开振,他是利用业余时间写出了《深入浅出 MyBatis 技术原理与实战》这本书,半年内卖了 2 万册,拿到了十几万的版税,才决定自由职业的。
比如你做软件外包或者私活,也要开发几个客户接几个项目看看收入情况;如果做众包,则可以到云沃客、解放号、程序员客栈、码市等地方去验证半年左右,看自己的开发技能,能为自己带来多少单子多少收入。
如果你不做任何准备,不经市场测试,脑子一热就脱离组织,往往会陷入冷启动的泥沼,肠子悔青。
假如做市场测试时发现收入很低,做不起来,不要气馁,要看看别人,尤其是和你经验、水平、身份差不多的人,有没有做得好的。
比如我写书,版税很低,一本卖三五千册,不赚什么钱。可是杨开振一本书半年卖 2 万册,版税谈得也高,就有很可观的收入。那这个时候,就要找差距,看怎么提高。
饱和度测试
自由职业不是不工作,只是不在组织内工作而已,你依然要投入足够的时间才能创造像样的产出赚到你想要的钱。
你在单位上班时,老板们会给你安排事情,你不用考虑工作负荷是否饱和,哪怕你一天到晚没事儿干,也可以领到一份薪水。自由职业后就不一样了,你必须主动安排工作,让自己有足够的负荷,否则你逍遥自在不了多久就会陷入困境。
饱和度测试就是要让你提前适应自由职业后自我安排工作的特点,看看你规划出来准备在自由职业时做的事情,能不能把你的时间填满。
可以分两步: 先全力去做,看能不能把你现在的业余时间填满。假如填不满,OK,你不用自由职业,就继续现在的工作,业余时间做你想做的事情,赚一份额外收入就行了。
假如你现在业余时间远远不够用,那估算下到底会占多少时间,平均每天几个小时。假如平均每天4个小时,那OK,另外 4 个小时你做什么?你需要再找点儿事情来填满它,可以是赚钱的事情,也可以是兴趣、爱好、休闲,总之你如果有大把时间无事可干,就会出问题。
预期管理
预期管理包括四个方面:
冷启动周期。像接项目、写书、在线课程,都有个回款周期,所以你应该设想一下,你可以承受的无收入的起始阶段有多长,并为此准备一些钱,比如你预计周期为 3 个月,那你就要准备上至少够 3 个月花的钱。
收入预期,最近三年,预期收入达到什么规模。
时间预期,准备做多久来验证自己真的可以持续走下去。
成就预期,你打算在哪个方向上取得什么成就、建立什么名声。
B和Z方案
你要设想,万一你现在规划的事情,收入不如预期,不能保持你的生活水准,你还准备再做些什么?这就是你的 B 方案,你要有至少 2 种可以变现的事情。
再设想一下最坏的情况:万一你无论如何都养不活自己,该怎么应对,是回单位上班?还是吃存款、继续硬撑?你一定要提前做好备案,这样才可以从容应对。
自由职业的自由与焦虑
在这篇文章的开始部分,我们说“你向往想干什么干什么,想怎么赚钱怎么赚钱的生活”,因此你考虑自由职业。但是,真实的自由职业,可能并没有想象中那么美好,它有自由,也有不自由;有高收入,也有与自由和不确定性伴生的焦虑。
自由
女儿看牙,时间约到周一下午,没关系,直接去了,不用请假。复诊,约到周五下午,没关系,直接去了,不用请假。
朋友约见面聊天,周三中午,没关系,直接去了,不用请假,因为不用考虑上班的事情,聊到几点是几点。
今天我累了,就晚点起来,没关系,不用担心上班迟到。今天晚上我有兴致,可以写作到凌晨 2 点,没关系,第二天不用上班。
你看,这就是自由职业最大的好处:拥有安排工作时间的自由。只要你完成任务解决问题,鬼才管你什么时间工作。
然而,你的自由是建立在自律的基础上的,你的自由是如何安排自己工作的自由,而不是不工作想干什么就干什么的自由(那是财务自由)——因为你要赚钱养活自己。
举个例子,你答应了客户周四完成开发交付软件的第一个版本,结果你周一周二都有事情,代码没完成,可以把交付日期更改到下周一吗?不行!
如果你在单位做事情,可以找上司说:“哎呀老板,出现了点状况,是这么这么回事儿,看来这个事情得延期一周才行……”也许这样老板就会答应,你就又有了时间。
可是你自由职业后,没有老板啊,你得自己维护自己“值得被信任”的形象,得让你的雇主觉得你“靠谱”。所以,你承诺了就要做到,哪怕熬夜赶出来!
这就是一种不自由。
焦虑
上班最大的一个好处是:不用考虑你要做什么事情,不用考虑你做的事情能不能创造经济价值,不管怎样,你都每月固定拿薪水。只要你在单位待着,哪怕刷一天朋友圈,也有钱拿!这是多么大的幸福啊!
可是自由职业者就不一样:不做事就没钱啊。而且,更尴尬的是,做事也不一定有钱啊。
所以,自由职业者每天都会受不确定性的干扰。譬如我,用了记账软件记录收支,每次看到一大片红色就焦虑,心里就琢磨:“ 哎呀我的钱什么时候到账啊。” 要是看到这个月的支出已经远超收入,就焦虑得不行,“ 哎呀,差这么多啊,下个月能不能补赚回来啊。”
这是你对收入波动性的焦虑,尤其容易出现在刚刚成为自由职业者的时候。
还有第二种焦虑:你做的事情是否能够持续。
以我为例,我打算每年写两本书做两门课,可是这真的可以吗?一年、两年都觉得没问题啊,但真的可以这样一直做下去吗?3 年、5 年、10 年都没问题吗?我会一直有主题可写?会一直有系统的课程可以开发?
状态好时我觉得这都不成问题,因为既然我之前可以找到话题,将来也一定会有新的话题出现。状态差的时候就会焦虑:能想到的话题都做差不多了,下一个话题在哪里啊?万一明年没什么可写该怎么办?
现在,你知道了一切:开发者实现自由职业的 4 种常见方式,5 种必做准备,以及可能的自由和焦虑。你准备开始了吗?