成长:浅谈从前端小工到工程师的三年转换

向作者提问
永远都会写代码的程序员;从事前端,客户端这个领域8年之久,前远光,携程,阿里巴巴程序员,经历了从前端到大前端的变革,在工程化,Hybrid,Weex,Node.js等方面有着丰富的经验。目前创业中...从事Golang,前端的研发工作。
查看本场Chat

我大概是在 2008 年的时候接触到了网页制作,当时还比较流行 Table 布局,给朋友接了一个小项目,因为本身是做后端(Python),网页也要求后端开发一起写了,并未有如今细分的如此之严谨,那个年代前端(网页制作)专职的人,是会被要求有如下技能:

  • div+css 布局
  • flash 制作
  • Photoshop 制作
  • 能使用 jQuery

时代变迁,如今的前端,可能会被要求如下技能(不完全):

  • 熟练掌握移动端开发,了解手机适配以及容器特性
  • 熟练运用 JavaScript 语言与 HTML5、CSS3 等技术
  • 熟悉模块化、前端编译和构建工具,熟练运用主流的移动端 JS 库和开发框架(React、Vue、ng),并深入理解其设计原理
  • 能提供完善的 WebApp 和混合 App(JS 方向)技术方案,了解服务端(Node/Java 或其他语言)或 native 移动应用开发;
  • 对技术有强烈的进取心,具有良好的沟通能力和团队合作精神、优秀的分析问题和解决问题的能力。

用一小段招聘历史的变迁,其实可以从侧面反映出来一个行业的历史变迁。时代在进步,技术也在进步,不进则退的道理,十分适用于编程这个行业。俗话说的好,酒放的越久越香醇,但编程之道,某种意义上也有相同之处,但往往意外就发生在一个意想不到的领域——前端。前端这几年变化之快,几乎做前端的人都有一种焦虑感,这种焦虑感有蔓延开来的趋势。

今天我想给大家分享的是,从新手到老手的一个转换过程,在这个过程中,我们该如何去保持初心,并且能实现自我的转换和增值。

我的编程之路

说到编程其实我是半路出身的人,在很多年之前编程对于我如同“在塔克拉玛干中找绿洲一般”,撞上完全看概率。在很小的时候家里没有电脑,但是却有小霸王(还是父亲从广州托人邮寄回来的),虽然父亲希望我能用它学习打字,不过多数情况下,我都用它在玩《魂斗罗》了。

最开始(有意识地)接触编程还是在读高中的时候,学校对于市里的《电脑比赛》很重视,虽然是打字以及基础的 C 语言(题目我还记得很清楚,输出一个乘法表)。但是我没有继续学习,比赛完之后就抛之脑后了。

不过可喜的是,我竟然发现自己很喜欢电脑课老师推荐学习的 Python,坚持阅读完了一本书:

《Python 网络编程基础》

高中读完(没有去念大学),一直在雪峰山里的老家,过着自己的隐居生活,一过既是三年。

2011 年的夏天,穿着短袖站在长沙火车站,脸油油的一夜未睡,从怀化到长沙的绿皮火车需要开一个通宵才能到长沙。去找了第一份当时还叫网页制作的工作,那时候的我如同一个小白,就这样误打误撞的得到了一份工作,在长沙的三个月,我学习了很多东西:

  • div+css 布局(position布局和float布局)
  • 了解到了基础的语义化(比如超链接的时候用 a 标签,标题用 h 系列标签,按钮用 button,行内用 span)
  • 学习了 JavaScript 基础(比如大量的使用函数,俗称面向过程编程,一个功能一个函数,大的功能用很多个小函数组合而成)
  • 接触了 jQuery(会用 DOM 选择器,那个年代没有比 jQuery 更好的解决方案)
  • 了解到了 IE6 兼容性的问题(虽然,我现在都忘记的差不多了)

阅读到的书有:

PS:这四本书有些年头了。

真正开始有意识的对编程的认知还是要从珠海开始,那时候在自己的心里才建立起了体系。不得不说,从长沙到珠海的跨越对于自己的职业和专业有了非常大的促进作用。远光软件是一家企业管理和社会服务信息系统供应商,以国家电网,南方电网做为主要的服务客户(当然还有五大发电集团以及珠海市市政系统的研发)。到远光软件,做的第一个项目就是《费用报销系统》,这是一个典型的单页应用(SAP),在客户端层面进行了 MVC 分层,模块化,以及大量的操作表格(编辑费用报销流程)和 Ajax 的交互。

  • 了解到了 MVC,参与了公司内部 MVC 框架的开发(seeker.js)
  • 重新学习了 JavaScript,对于这门语言有了更深刻的体会
  • 了解到了 Ajax 以及网络传输层的通信(HTTP)
  • 开始认识到构建一个大型项目,模块化的重要性
  • 开始了解到有 Grunt 这么一个构建工具
  • 学习了 Node.js

在珠海的日子里现在想起来自己的状态:就是一个只会学习的机器。那段时间,我对 Objective-C 产生了浓厚的兴趣,开始自己倒腾黑苹果,学习 Objective-C,CocoaTouch 框架,参与部门内部项目的开发(虽然半途夭折了),接触到了 UNIX 操作系统,这才发现自己一直使用的 Windows 好 low 啊。那个时候的自己真让自己怀念,其实学习它真的是一种精神(不断的探索、不断的吸取),坚持下来之后,才能知道雨后会不会是彩虹。

在珠海这一过就是两年,阅读的书籍非常多,多到自己都数不清楚了,大体上来说分为了两个部分,语言类的和编程思想类的,印象中大约还能记得的就只有这些了:

JavaScript

iOS

编程思想类

阅读完那三本书(iOS)之后其他时间学习 iOS 开发就靠官方文档以及 Google 了,其实中间很长一段时间内自己并不清楚自己到底喜欢哪一个,索性两个都比较深入的学习了,当时自己都不知道这个决定对于今后有多大的影响,后来我才发现我特别的适合做混合应用(Hybrid App)或者手机端的开发,因为我对 Native(iOS 端)的熟悉程度不亚于前端(HTML、CSS、JavaScript)。慢慢的对于应用我更关注代码的层次维护性与可读性,使用 Instruments 来分析优化 iOS 应用,抓包分析 HTTP,在设计(软件设计模式)与编写之际找到一个平衡。真的还要感谢网易公司(黄易^_^)推出了《网易公开课》补全了我大量计算机方面的基础知识。

2013 年底,我去了携程无线事业部,虽然,我们最后解散分拆了(很可惜)。携程的 App 和手机网站全部使用 Hybrid 技术来构建,一套代码运行在三端(iOS、Android、Mobile)。在无线事业部感觉每一天都过的很新鲜,因为我能做很多事情,一是验证自己的想法,二是积累了大量的实践经验,三是我可以做更多混合编程的东西:

  • 通过 bridge(自定义协议)与 Native 进行交互
  • 研究了 phoneGap 的技术,比如在“后台”相对于前端 Native 就是后台,进行网络,线程的优化
  • 研究了辅助前端调试的工具,比如远程代理,客户端 App 代理
  • 对 JavaScript 语言有了更深刻的理解
  • 使用 Node.js 跑 SEO 页面,对 Node.js 掌握的比较全面了,采用新的技术解决回调过深的问题

在携程一直到无线事业部解散,分拆陆陆续续待了十个月,虽然很短暂,但是却印证了自己所想,在心底一直坚持的信念,有了一次很充分的肯定:使用前端技术开发手机 App。

这一年里一共买了三本书,不知道为什么后面这些年买书买的比较少了,更多的是通过开源社区来获取资料,学习。

从携程离职之后的 2015 年并不是很顺利,起伏经历了很多,但是这一年里却是买书读书读的非常多的一年。这是一个很有趣的现象,当然我闲下来的时候,读书成了我唯一的爱好。(2015 年我的阅读清单

  • 学习了 React、ES2015、Webpack
  • 开始去了解和掌握 React Native 的知识
  • 更深入的学习了 iOS,包括有新推出的 Swift 语言
  • 关注的点更多的是在于编程思想方面,比如最佳的实践,如何采用合适的技术栈搭建产品,编程的规范,自动化 CI 方面等基础设施的研究
  • 对于开源社区的依赖程度更高了,比如现今成了 Github 的重度用户

《企业应用架构模式》

总的来说我依然很看好 JavaScript 的应用范围,也打算继续耕耘在这个领域中,努力使自己的知识结构体系可以保持与世界趋势的同步。

如何将练习成为习惯?

任何知识,都是一个从陌生到熟悉的过程,在这个过程中,要将练习成为习惯,只有勤加练习才能加深对程序的理解和印象。

解决问题有两种方式:

  • 有一个模糊的印象,通过 Google 搜索能快速的解决问题
  • 有一个深刻的印象,自己编码来解决问题

而练习则是将这种模糊的印象变成深刻的印象,给自己一个小小的目标,一周写两个算法题,每天实现一个对应的函数,如 Array.push,一年之后你再来看你的状态,就要比之前一年要好的很多,这就是练习带来给你的知识沉淀。

举个小小的例子:

stdoutstdin,在 C 中如果有一个管道,来连接双方的一个输出一个读取,由于没有结束符号,一般 C 是将要发送的 byte 的长度先发过去,然后再将真实的 byte 发送完成。对应的读取,也是先取 4 个 byte,得到长度,然后再获取真实消息体。假设,你要完成这样的一个需求,当你有一个模糊印象时,你就能很快的使用Google搜索到正确的搜索结果,来解决问题。如果你对这个问题有很深刻的印象,那么这就是一个很小的问题,只是怎么解析消息体而已。

如何去找到难度适合的前端项目?

不要被全栈的概念所欺骗了。

如今的前端大体上可以分为四类:

  • 网页
  • 后端(Node.js)
  • 移动端(注明:这不是移动网页,而是类 RN Weex)
  • 运行时(注明:如 v8,JSCore 等)

如果细分下去,中间互有交叉,看似什么都能做,实际上能做和能做好,还是有很大区别的。举个例子,淘宝有专门的动画部门,这些前同事们主要的精力都在研究怎么做好动画(炫,酷),这是一个需要时间积累的过程,又比如大搜车,写 RN 的大部分还是客户端出身的同学,这就是背景知识差异,能做和能做好的区别。

我认为很有必要保持一个专业的精,然后横向扩展去一专多能,在刚起步时你可以选择专门做网页,也可以专门做后端,也可以去做移动端,去认真的积累不同领域内的知识点,三年一个时间点,再来回顾自己要去选择的路。一定要对目前的阶段有一个普遍的自我认识,只有完成正确的自我认识,你才能明白现在的阶段你适合去学习什么,好高骛远不适用于编程,因为有些事情,没有那个知识背景在,去学习也是一种浪费时间。循环渐进,一步一步的认识到自己在什么样的阶段,剩下的就是该如何进阶的问题了。

  • 第一年,学习 HTML、CSS、JavaScript 基础,比较适合的项目有 MDN 上各种的 Polyfill
  • 2-3 年,一定是《操作系统》,《数据结构》,《网络协议》等,比较适合的项目有,Node.js 相关的
  • 4-8 年,紧贴你的职业规划,这个阶段一定是跨端的,视野可以放在一个其他的编程领域中,如:客户端
  • ... 路漫漫修远兮,而求索了。

一定要善用 Github,去找到合适你学习的项目。

如何判断市场的需求?

相比前几年如今去判断市场需求,有了更好的工具让你使用,比如:https://readhub.me/jobs

如何去正确的坚持?

自认为我是属于永远都会写代码的那一类程序员,坚持,是一种很贵的品质。当我们走过起步的阶段,进入一个尴尬的年龄时,面临了比很多其他人更难的选择,甚至在职业,专业的选择方向上,让你很难去坚持最初的初心。

我的办法是,用一张白纸,写上自己的目标和结果,向着目标和结果去坚持。

如:

  • 我的目标是学习完后端,结果是找到一份后端的工作。
  • 我的目标是完成一个开源项目,结果是 star 1k。
  • 我的目标是设计一个在线服务,结果是服务 1k 的客户,月收入 1000$。

至于过程,你可以用 Node.js,也可以用 Python,你可以完全的设计这个过程该怎么实现,找到自己的目标和结果,这是让你可以正确坚持的有效途径。

如何看待当下的焦虑?

有时候“工作”仅仅是工作,但编程不仅仅是工作,去知乎上能搜索出来一大把程序员 30 岁之后该怎么办的问题,有人走,有人留,这种情绪放大了我们的焦虑。我曾经有一段时间也特别的焦虑,焦虑于感觉生活要进入绝望的状态了,买不起房,也存不下钱,感觉在北京打工完全是给房东打工了,夜深人静时,晚晚的睡不着,说是在思考,其实是在想,与其这样不如回去的矛盾,走出来了又回去,落差感还是很强烈的。

后来想了想,生活不就是如此吗,有一个朋友和我讲了一句很有用的话:人都是会随着岁月而变化的,不是变老,而是变的更好。

找到一个平衡的焦点,释放这些焦虑,一路向前。对于刚刚毕业的新同学,如果能进大厂,尽可能的选择大厂。

写在最后

最后,我为大家整理了一份学习指南(比较偏前端-后端这条技术栈):


本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。

微信扫描登录