警告:本文包含一些可能令「正常人」反感的内容
在开始之前,先来了解几个事实。
- 互联网行业不需要天赋。在目前已知的互联网世界里,还没有到需要拼天赋的时候。
- 互联网行业代表创新和互联,而传统软件行业的代表是外包。在互联网行业工作人员叫做工程师、设计师,在传统软件行业工作人员叫做码农和美工。
- 走进这个圈子代表你必须放弃很多东西——在一开始的时候会很孤单、会被周围的人当作神经病,然后变得越来越不合群、开始脱节于这个病态的社会。这并不是你的错,但是你仍要做好心理准备。
- 你需要热情和信念加入这个圈子,因为大部分时间你并不是为了生计而工作,这很辛苦。如果你只是不想饿死、只是想找个工作混日子,请滚回去乖乖继续做电脑白痴、蝗虫和伸手党。传统行业 (
大概也不会) 欢迎你。 - 你还需要一些勇气,理由如下——
- 这里的人都比较喜欢装逼,所以当你遇到了看起来很难很不会的名词的时候,其实那只是创造者起了一个看起来很装逼的名字而已。
- 这个行业日新月异,有可能你努力钻研的东西一夜之间一文不值完全泡汤废掉,也有可能赖以生存的看家本事因为一个意外就被整个业界所唾弃。所以请多接受和尝试新的东西,然后 (可选) 造一个更圆的轮子。
- 你在未来比较长的一段时间内遇到的问题都是纸老虎,如果你害怕而退缩,你一定会错过手边就有的答案。
- 你将要面对无数次大大小小的失败,在各种情况下。
如果已经下定决心,请耐心读下去。否则请关闭此文件 / 页面然后该干嘛干嘛去。
第一步——准备工作
作为新人进入互联网业界的时候,最重要的不是你的技术如何,而是精神和执行力。这里不是允许你纸上谈兵的地方,更不允许你在没有思考的情况下盲目做事。前者叫做键盘侠,后者叫做蠢货。
但是看重精神和执行力并不代表这个世界不看重你的能力。而在你所有的能力中,最重要的也是直接受到精神和执行力影响的就是你的学习能力。
请认真读完下面的两篇文章。如果没有读懂,请再读一次直到读懂、烙印在脑海中为止,否则请不要继续向下看。
从现在开始,请时刻提醒自己如何 behave。然后尝试做好下面的要求:
学好英语
一个简单的标准是 CET-6 要可以裸考通过。如果是 TOEFL 或 IELTS 裸考通过则更好。
你需要很强的快速阅读能力来阅读各种技术文档,因为除了日本人做的东西文档大多为日文之外,原版的技术文档基本都是英文的。在很多翻译作品质量和更新进度实在残念的情况下直接阅读官方文档是最好的学习和解决问题的途径。虽然官方文档有时候自己也比较坑——这时候你需要足够强的英文表达能力来联系作者、反馈 / 交流问题甚至帮助完善文档。
你造吗?当你雄心勃勃正准备扬帆启航的时候却发现船撞上了语言不通的暗礁的感觉倍儿酸爽。
那么英语怎么学,一个简单快速有效的办法:用。(废话)
- 词汇:如果词汇量高于 1500,就不用再刻意去记忆单词。如果低于 1500,那么就要恶补了。记忆单词的时候先记忆含义,然后根据发音记忆拼写。
- 听力与口语:闲来无事的时候多看美剧或英美的电影,演员们的发音语速一般不快并且咬字清晰。尝试看字幕跟读,模仿发音、语义语调、语气和连读。速度跟得上之后尝试不看字幕跟读台词,然后一边跟读一边代入剧情 (上下文) 尝试理解对话的含义。
- 阅读和写作:读读读读读读。找文章做快速阅读练习,做互联网的话其实网络上大量的技术博客文章都可以拿来读。读的时候目光提前一些即可预知即将要读的词语从而做到连贯阅读,然后随时注意单词和短语的用法,好的用法可以多读几遍记下来。遇到不认识的单词先尝试通过上下文理解,然后再查字典。PC 系统上可以安装很多字典工具,Mac 电脑则内置了字典,三指点按词语即可查找含义。
最后:不要尝试翻译。
——什么?
不要尝试翻译,不要尝试翻译,不要尝试翻译。重要的事情说三遍。因为你不是口译人员,你不需要翻译出来给他人。任何语言本身都是自然语言,都是人类可以理解的。学英语的时候一定要翻译成中文才能记住含义,那么英国人美国人怎么学英语呢?直接理解的效果是完全不用费劲即可快速掌握一门语言的运用。
学会使用 Google
在大陆首先多一个难题——如何访问 Google。不过这不是讨论内容所以请通过自己的努力或按照「提问的智慧」通过正确的渠道向正确的人寻求帮助。
在通过 Google 搜索时,特别是搜索技术问题时请使用非口头化的英文关键字。这些 tips 和搜索操作符可以提升搜索的精准程度。
在搜索技术问题时,不要使用大陆公司开发的搜索引擎,例如百度。
学会写邮件
邮件谁不会写呢?填个收件人,连主题都不用写,想说啥团成一坨塞正文框里一溜逗号最后丢了句号连个换行都没有,说不清再附上个 .doc 文件一点发送就完了。
这样的邮件,叫做「垃圾邮件」。
邮件作为互联网世界最重要、也是最正式的快速联系手段,请时刻注意你的邮件满足下面的标准:
- 认真检查收件人地址、抄送地址,必要时请使用密送。
- 请写一个合适的标题,需要的时候要自带标签,例如
[OT]
(Off Topic),[WIP]
(Work In Progress) 或[PSA]
(Public Service Announcement)。 - 请像高考作文一样写正文,没有人愿意看你那一坨不知道在说什么的文字。注意断句、断章和标点,适当使用一些符号来表示列表 (‘
-
‘或’*
‘)、重要 (‘**
‘或’__
‘),另外中西文之间要有空格,英文的断句标点后面也要有空格。 - 不要随意使用叹号,把叹号当作逗号 / 句号使用只会招致强烈的反感。日本人可以把顿号当逗号使,但是你不行。把逗号当省略号使会让他人心里发痒。在西文中绝对不要出现全角符号。
- 使用合适、清晰、易于阅读的字号、字体和颜色;粗体、斜体和下划线用于强调和醒目,全部都用的效果是屏幕上都是色块而完全无法阅读。然后,把你那张难看的邮件背景图删掉。
- 在没有特殊要求的情况下如果要有文档附件,请使用尽可能兼容的格式,例如 pdf 或者纯文本,而不是 MS Word 创建的
.doc
和.docx
。 - 在最后附上敬语、问候和你的签名,这是基本的礼貌。
在邮件列表里则还要注意:
- 回复到邮件列表 (回复所有人) 并且抄送你要重点回应的人。
- 如果你订阅了 digest,请不要直接回复系统生成的 digest,因为这会破坏邮件线索。
- 不要发送过大的附件,因为也许有人在使用昂贵的移动网络。大文件请使用链接。
最后:如果你不是一段时间内完全无法访问邮箱的话,请把你那该死的自动回复关掉。
第二步——搭建舞台
信息技术广阔无垠,如何选好一个方向总是困扰新人的问题。曾经也在社团的新生见面会上说过一些,我的答案是:不急找你的方向,你需要的是更加 fundamental 的东西——那就是你的舞台。
为什么要有舞台——因为它给你足够的空间,让你大展拳脚。所谓的舞台,就是在互联网世界中生存的基本技能。不需要你多么精通,但是这些零碎的东西总是在你需要的时候派上大用场、大幅提升工作效率,对于多种技术的了解甚至可以帮助你优化整个系统的架构。
现在把这些 fundamental 的东西分类为理论知识和实用性技术,简单介绍下。
理论知识
- 计算机体系结构
- 操作系统
- 通信原理和计算机网络
- 数据结构和常见算法
基本都是学校里见到的课程对吧。现在后悔当时为什么不听课了吗?
其实现在不晚。这些东西并不是短时间能够掌握的,目前也不需要多么熟练的掌握。在互联网世界里成长的时候总有各种机会让你遇到运用此类知识的很现实的问题。然而在前期你可以通过搜索现成答案来解决问题,这些只会在后期的高阶发展对你形成瓶颈。所以现在就开始一点一点带着看吧,熟悉一些总是会有帮助的,至少在你需要的时候知道要去搜索哪些东西。
实用性技术
- GNU/Linux 操作系统,命令行和 shell 脚本
- 一门弱类型的脚本语言
- 正则表达式
- 常见系统的架构
- 一套熟悉的工具链
- (可选) 一门 Lisp 方言
哇。都是没见过的东西呢——
GNU/Linux 是目前互联网中运用最广泛的生产力系统,也是最适合初学者学习和研究的系统。因为它是开放源码的,有大量的文档和问答社区,有大量优秀的设计也有诸多不足。Linux 命令行和 shell 脚本则是可以极大提升生产力和工作效率的工具。同样优秀的工作平台还有 OS X,但是作为学生并不一定有足够的预算购买 Mac 电脑,所以购买普通的 PC 然后安装 Linux 发行版是很好的选择。
—— Q: 为什么不能用 Windows?
—— A: 问这个问题的一定是没读「如何成为一名黑客」的,翻上去再用力读三遍。
新版本的 Windows 确实已经变得很优秀,但它仍不是一个开放的系统,不适合给新手研究和学习。
在 shell 语言不足以应对的复杂需求下,掌握一门弱类型语言可以在短时间内编写出实用的小程序来完成任务。例如 Python, Ruby 或者 JavaScript (注意 Python 是强类型、动态类型检查语言)。这些弱类型的脚本语言可以让你不用考虑类型转换的麻烦问题,而且出错也可以在不借助调试器的情况下快速定位、解决问题。
正则表达式看起来晦涩难懂,其实在实际开发中使用也并不多。但是在很多情况下,用正则匹配、测试、分割,可以节省下的时间绝对值得去学习它。
了解一些系统的架构,例如 B/S 或 C/S 架构的系统的各个组成部分及用到的技术和框架,它们是如何工作的,有哪些优秀的设计,这些都有助于你锻炼设计系统架构和独立开发的能力。
而做到上面这些,你需要一套基本但是好用的工具链——编辑器、编译器或运行环境、调试器 / 测试工具。
了解 Lisp 有益于培养程序思维,不多说。有兴趣可以自己看,市面上有些书也很不错。
除此之外…
说了那么多,大概已经有不少人打退堂鼓了。社团里遇到过很多这样的同学,想要学习也愿意学习,但是来参加几次社团活动之后就没再出现过。每每和主席感叹,如果坚持不下来,何必当初来浪费时间。
坚持作为一个决定性的长期要素,除了自身毅力之外也受到很多因素的影响——
- 目的性太强。为了达到一个长期目标而学习一项看起来不怎么有关系的基础技术,很快就会有疲倦感。
- 学习一项技能一段时间后没有任何成就的感觉。这是很多人的误区,由于填鸭式的教育导致学生认为「学习就是干念书」,不做题在考试中无法得高分,不动手尝试执行命令、写代码测试结果,也永远无法学会这些东西。
- 没有乐趣。互联网的成长之路大多是枯燥无味、孤零寂寞的,所以如果没有真的喜欢,也就没有「我要折腾」的动力。很多人接触 Linux 是因为那炫酷的桌面特效,进而熟悉了这个平台、加入了用户社区… <- 关键在这里。
在线游戏的好玩之处在于有人一起玩,没人的时候体验还不如单机小游戏。技术性用户社区就是大家陪你一起折腾和交流的地方。遇到了问题、有了新发现、折腾出了一点小成果,发布在社区,分享的喜悦和满足感会一点一点积累,这就是你会喜欢的理由和坚持下去的动力,也就是乐趣的来源。
那么
可能是一些人现在最关注的问题:学习上面列出的东西需要多久?
if (practice == true) {
return '1 week'
} else {
return 'never'
}
(jixun: 这段代码可以简写为 return practice ? '1 week' : 'never'
)
答案是最快一周。当然如果你根本不动手自己做的话,永远也别想。
一周如何做到?1 天了解并疯狂尝试各种 Linux 发行版,+1 天选一个最喜欢的发行版并玩转各类常见命令,+1 天尝试编写简单的 shell 脚本,+1 天在官方网站或 Coursera 或 Codecademy 学习 Python 或 Ruby 或 JavaScript,或者在某个语言的官方网站上尝试 quickstart 指引教程,+1 天来编写各种小玩意实现一些有趣的东西,顺带尝试应用简单的正则表达式,+1 天阅读 Wiki 和一些开源框架 / 系统的设计文档,了解 MVC 等系统架构。最后一天——尝试在 Linux 上安装一个语言的运行环境,应用一个简单的 MVC 框架,收到请求时通过调用系统命令和调用系统库两种方式返回当前系统状态,这里有一个简单的样例。
听起来不可思议?现在就试试看!
(当然最快是一周,如果你花了一个月也并不代表你不行,至少做到了)
第三步——生命不息,折腾不止
基本的舞台搭好了,可以开始施展拳脚了吗?想得美。这舞台还不够牢固,你想跳一下就拆掉自己的台吗?况且——你有什么可以展示的?
想起来了吧,你还没想好要做什么呢。
但是经过了搭建自己的舞台,你应该已经掌握了快速了解一样新事物的方法。不管是语言还是框架还是库,按照文档即可快速套用 (当然是文档不坑的前提下)。并且现在拥有帮助学习的三大杀手锏——
- 最好用的搜索引擎 Google
- 最大的开源代码仓库 GitHub
- 汇聚千万问题的问答社区 StackOverflow 当然还有同公司旗下的其他类问答社区
——你还在担心什么?成长的道路上早已有无数人准备好为你提供帮助,只要你愿意找到他们。
石头说,「自己当全栈做个项目自然就知道自己喜欢什么了。」
全栈工程师,看起来好厉害,好遥远。但是不想当将军的士兵不是好士兵,所以现在就来体验一把「全栈」工程师吧!
第一个轮子
学习的历程,看起来可以写很多文章。于是开个博客吧。用什么呢?国内的那些服务太 low 了,现在流行自己写!
首先确定技术栈。根据所了解的 MVC 架构,需要一个用于处理请求并实现逻辑的 MVC Web 框架,需要一个数据库来存储数据,需要一套简单好用的前端库来处理样式和浏览器交互。于是常见的后端组合:
- Python Django
- Ruby on Rails
- Node Express.js
数据库类型,SQL / NoSQL / K-V,用哪个?没关系,目前的需求用哪个都可以。暂用目前最流行的 MySQL 好了。
前端库呢?当然首选 Bootstrap 和 jQuery 组合啦!
——慢着,听说 Angular / React 什么的很火爆?经验告诉你,一开始的时候不要想太多,不会走就想跑的结果是摔得更疼。
需求分析
一个 blog 需要哪些东西?
- 首页,包含最近文章列表
- 文章内容和评论
- 登录 / 注册
- 发布 / 编辑 / 删除文章
系统设计
- 路由部分
- 首页路径
GET /
- 文章页面
GET /post/[文章 ID]
- 登录
GET|POST /login
- 注册
GET|POST /register
- 发布新文章
GET|POST /new
- 修改 / 删除文章
GET|POST /post/[文章 ID]/[edit|delete]
- 首页路径
- 页面部分
- 首页 / 文章列表页
- 文章内容 / 评论页
- 登录 / 注册表单页
- 文章编辑页
- 数据库部分
- 表
users
项id, username, email, password
- 表
posts
项id, title, content, date, publisher_id, publisher_name
- 表
comments
项id, name, email, comment
- 表
系统实现
- 安装 Web 框架和所用语言连接 MySQL 数据库的依赖包。
- 根据 Web 框架的文档来定义路由和对应的处理方法。
- 根据数据库连接件的文档,在 models 里分别对每个表的增查删改 (CRUD) 方法做定义。
- 根据 Web 框架和 Bootstrap 的文档编写页面,根据 jQuery 的文档实现浏览器端的交互。
只是简单的照着文档做,在很短的时间里就可以搭起一个能够运行的 blog 程序。虽然还不完善,但是它运行起来了,并且看起来还不错。是不是很神奇?
——什么?遇到坑了?再仔细看看文档。还不对?搜索 Google 和 StackOverflow。找到解决方案后,记得在代码旁边做上注释。
好了,现在要做一些改进。但是别急,已经成型的代码要保存好。你需要一个好用的版本控制工具来记录每一次的修改,于是当前最流行的版本控制工具 Git 成为了不二之选,可以公开的代码保存在 GitHub。不过放在 GitHub 上总得有个东西描述这是干嘛的、怎么用的吧,所以参照 Markdown 语法和 GFM 增强来编写一个清晰的文档,保存为 README.md
。
按照 Git 和 GitHub 的文档创建远程和本地仓库、添加文件并提交后同步本地更改到远程仓库。接下来可以放心大胆修改代码啦。
需要优化的地方:
- 验证用户邮箱、重置密码、登录失败提醒
- 新增用户头像
发邮件的部分需要支持邮件协议,于是 Google 搜索得到 SMTP
协议用于发送邮件,然后继续搜索当前语言的 SMTP 支持库并安装、按照文档将邮件发送功能加入博客程序。
用户头像则有两个选择,本地上传或 Gravatar。似乎 Gravatar 是个不错的选择,但是需要在文章页面中获得发布者的邮箱 md5 值。那么在数据库 posts
表中新加项 publisher_emailhash
来保存发布者的邮箱 md5 值,然后修改页面加入头像链接。
搞定,看起来好看多了。啊,要放在网络上的话每个人都可以看到,如果遇到了骇客怎么办?是不是要检查下安全问题?嗯,从最简单的来试试看吧——
Google 搜索常见的 Web 程序安全审计手段,泡一泡 CTF 社区,然后在本机把博客程序跑起来,URL 后面加 '...
再提交、文章里插一句 <img onload="alert('xss')">
… 等等。啊咧,貌似中招了…
Hello, Internet.
写好了博客程序,不跑起来让全世界看到怎么对得起自己。想要运行公开的网络程序,需要一台公网的计算机,也就是服务器。感谢虚拟化技术,现在简单的虚拟机服务每个月只需要不到 30 元即可获得。
小型虚拟机只能支持 Linux 系统,不过没关系,因为 Linux 已经占据了 98.3% 的服务器市场份额并且你也已经掌握了 Linux 的基本操作。
通过 ssh
程序可以方便连接登录服务器。而网络上有大量的教程告诉你如何配置服务器和搭建各类程序。虽然博客程序是自己写的,不过搜索所使用的框架程序的搭建依然可以得到通用的结果。
接下来,为了能让大家方便访问,还要申请域名、做域名解析指向自己的服务器 IP 地址。顺便再做个域名邮箱吧~
博客跑起来了,小站架起来了,是不是很兴奋?快去熟悉的社区里和其他人分享 (记得附带源码地址)。
All on mobile
有了自己的博客,有想写的东西就可以写下来发表上去。但是如果在外面没有笔记本电脑怎么办?
答案当然是在手机上写!
虽然 Bootstrap 已经有移动端适配,但是浏览器页面由于移动设备内存不足等等问题经常会刷新,辛苦写的可能一个锁屏就没鸟。所以,来写个程序给手机用吧。
Google 告诉你,目前最热的 Android 平台使用 Android Studio 开发应用程序,主力语言是 Java。iPhone 使用的 iOS 平台则使用 Xcode 开发,使用 Objective-C 语言或 Swift 语言。iOS 应用开发必须有 Mac 电脑,所以平台的选择看个人兴趣和现有资源——这种时候不要为了学什么东西而花很多钱,因为事实上很多时候东西买来了也没兴趣学了。
按照老样子,一切你需要的资源都已经在互联网上免费为你准备好,一切你需要做的就是设计一套合理可行的方案,然后用心读文档和示例源码,并把它们运用到你自己的程序中。
(这里只是一个从开始一点一点折腾起来的例子,你不一定要去写一个博客程序,也有可能是其他的,但是任何项目的开始都是这样,尝试自己思考然后做一个有意思的东西出来吧!)
全栈是这样炼成的
虽然在互联网上有无数资源随时帮助你纳入新的知识、学会新的技能,但是从头到尾是你一个人独立把所有的程序建立起来的。前端、后端、数据库、运维、移动端,所有的业务代码和命令都是你亲自在键盘上编写的。
这一段历程中不可能不踩到坑,也会有做不出而丧气的感觉,当然也有折腾了半天结果发现答案异常简单的悲欢交结。虽然事实上距离真正的全栈工程师还差得远,现在的程度也远远不能到作为生产力的地步,但是至少你已经成功地迈出了跨度最大的一步,也一定在社区里或者技术交流群里交到了谈得来的好基友,渐渐地能力得到网络上大家的认可,认识越来越多的牛人,网络上的人脉飞速发展。
此时的你,已经万事俱备。只欠——
第四步——扬帆启航正当时
读到这里时,总结下你一路走来所学到的:
- Linux 操作系统的运用和基本运维能力
- Web 应用开发技术
- 简单的前端页面开发能力
- 基本数据库操作
- 版本控制 (Git) 的运用能力
- 文档阅读和编写能力
- 常见安全审计技能
- 移动端开发技术
- 从以上技术运用和学习中延伸的各类知识
是不是很惊讶,原来自己已经接触了这么多!但是最重要的一点、也是整个业界最看重的一点能力——快速独立学习的能力在无形中也得到了极大的提升。
现在,对互联网业界常见技术已经亲自动手了解一遍的你,应该对自己想要选择的方向有一个明晰的感受了。选定的方向就是你的东风,助你扬帆启航。
哦对了,一开始提到的「理论知识部分」,记得要带着看。因为在向一个方向深度学习时在理论上的缺乏会严重阻碍进步的速度,而只有在一个方向上做得足够深,才能做出属于自己的技术。否则不配「互联网」的标签。
@phoenixlzx 2015 年 9 月 21 日
写给同学们、学弟学妹们,和想要踏入互联网世界的最亲爱的朋友们。
后记
一直在犹豫要不要写这样一篇指南性的文章,写到什么程度。今天看到同学在班级群里的聊天,以及 A3G Hackers 群内的讨论,遂决定着手尝试写一篇稍微详细一点的初步指南给迷茫着的同学和学弟学妹,以及网络上的朋友们。写得差不多时觉得是不是口气太大、语气太硬了点,因为互联网不看年龄,说不定这一届新生就藏着一只低调的大神。但写到最后还是经常在工作室说的那句话,在同学和学弟学妹们面前装个逼,应该还是可以的。
这篇文章描述的是我的亲身经历,希望对看到的人都有所帮助。本来是准备写一个更通用一点的经验谈给后辈的结果先泄露了一半出来了 (笑)。
感谢火星猫、百合子、玲奈、壕桥、足兆叉虫、Yk、Ave、A3G Hackers 的 Ricter、Canonical 的 happyaron、萌导航的杏子酱… 等等数不清的陪我一路走来、和我一起讨论解决问题、给我激励的好朋友,还有南京 LUG 的各位、夏耐老师等等悉心教导我的长辈们。感谢你们。
这篇文章可能随着时间会慢慢过期、甚至可能不再适用于那时的互联网业界。而且我现在寥寥数年的互联网从业经历还远远不够,如有不足之处欢迎提出改善意见。本文使用 cc-by 4.0 协议发布。